Browse Source

[ADD] Initial commit 'laundry_management'

pull/195/head
Ajmal Cybro 4 years ago
parent
commit
1c3de031fd
  1. 41
      laundry_management/README.rst
  2. 24
      laundry_management/__init__.py
  3. 48
      laundry_management/__manifest__.py
  4. 8
      laundry_management/data/data.xml
  5. 10
      laundry_management/doc/RELEASE_NOTES.md
  6. 23
      laundry_management/models/__init__.py
  7. 472
      laundry_management/models/laundry.py
  8. 23
      laundry_management/reports/__init__.py
  9. 98
      laundry_management/reports/laundry_report.py
  10. 19
      laundry_management/security/ir.model.access.csv
  11. 34
      laundry_management/security/laundry_security.xml
  12. BIN
      laundry_management/static/description/assets/icons/chevron.png
  13. BIN
      laundry_management/static/description/assets/icons/cogs.png
  14. BIN
      laundry_management/static/description/assets/icons/consultation.png
  15. BIN
      laundry_management/static/description/assets/icons/ecom-black.png
  16. BIN
      laundry_management/static/description/assets/icons/education-black.png
  17. BIN
      laundry_management/static/description/assets/icons/hotel-black.png
  18. BIN
      laundry_management/static/description/assets/icons/license.png
  19. BIN
      laundry_management/static/description/assets/icons/lifebuoy.png
  20. BIN
      laundry_management/static/description/assets/icons/manufacturing-black.png
  21. BIN
      laundry_management/static/description/assets/icons/pos-black.png
  22. BIN
      laundry_management/static/description/assets/icons/puzzle.png
  23. BIN
      laundry_management/static/description/assets/icons/restaurant-black.png
  24. BIN
      laundry_management/static/description/assets/icons/service-black.png
  25. BIN
      laundry_management/static/description/assets/icons/trading-black.png
  26. BIN
      laundry_management/static/description/assets/icons/training.png
  27. BIN
      laundry_management/static/description/assets/icons/update.png
  28. BIN
      laundry_management/static/description/assets/icons/user.png
  29. BIN
      laundry_management/static/description/assets/icons/wrench.png
  30. BIN
      laundry_management/static/description/banner.png
  31. BIN
      laundry_management/static/description/icon.png
  32. BIN
      laundry_management/static/description/images/checked.png
  33. BIN
      laundry_management/static/description/images/hero.png
  34. BIN
      laundry_management/static/description/images/laundry1.png
  35. BIN
      laundry_management/static/description/images/laundry10.png
  36. BIN
      laundry_management/static/description/images/laundry11.png
  37. BIN
      laundry_management/static/description/images/laundry2.png
  38. BIN
      laundry_management/static/description/images/laundry3.png
  39. BIN
      laundry_management/static/description/images/laundry4.png
  40. BIN
      laundry_management/static/description/images/laundry5.png
  41. BIN
      laundry_management/static/description/images/laundry6.png
  42. BIN
      laundry_management/static/description/images/laundry7.png
  43. BIN
      laundry_management/static/description/images/laundry8.png
  44. BIN
      laundry_management/static/description/images/laundry9.png
  45. BIN
      laundry_management/static/description/images/logo.png
  46. BIN
      laundry_management/static/description/images/modules/barcode_image.png
  47. BIN
      laundry_management/static/description/images/modules/barcode_scan_image.png
  48. BIN
      laundry_management/static/description/images/modules/export_image.png
  49. BIN
      laundry_management/static/description/images/modules/hide_image.png
  50. BIN
      laundry_management/static/description/images/modules/ip_image.png
  51. BIN
      laundry_management/static/description/images/modules/payment_image.png
  52. 706
      laundry_management/static/description/index.html
  53. 90
      laundry_management/views/config_view.xml
  54. 47
      laundry_management/views/laundry_label.xml
  55. 27
      laundry_management/views/laundry_report.xml
  56. 122
      laundry_management/views/laundry_view.xml
  57. 77
      laundry_management/views/washing_view.xml

41
laundry_management/README.rst

@ -0,0 +1,41 @@
Laundry Management v15
======================
This module helps you to manage laundry service.
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developers: Jesni Banu@cybrosys
Nilmar Shereef@cybrosys
Version 13: Nimisha Murali@cybrosys
Version 14: Minhaj T @cybrosys
Version 15: Gion @cybrosys
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

24
laundry_management/__init__.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Jesni Banu and Nilmar Shereef(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import models
from . import reports

48
laundry_management/__manifest__.py

@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2021-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Jesni Banu and Nilmar Shereef(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
{
'name': 'Laundry Management',
'version': '15.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', 'uom'],
'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.png'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

8
laundry_management/data/data.xml

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="laundry_service" model="product.product">
<field name="name">Laundry Service</field>
<field name="type">service</field>
<field name="invoice_policy">order</field>
</record>
</odoo>

10
laundry_management/doc/RELEASE_NOTES.md

@ -0,0 +1,10 @@
## Module <laundry_management>
#### 20.12.2021
#### Version 15.0.1.0.0
#### ADD
Initial commit for Laundry Management

23
laundry_management/models/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Jesni Banu and Nilmar Shereef(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import laundry

472
laundry_management/models/laundry.py

@ -0,0 +1,472 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Jesni Banu and Nilmar Shereef(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
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.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
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')})
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'
}
def return_dress(self):
self.state = 'return'
def cancel_order(self):
self.state = 'cancel'
def _invoice_count(self):
wrk_ordr_ids = self.env['account.move'].search([('invoice_origin', '=', self.sale_obj.name)])
self.invoice_count = len(wrk_ordr_ids)
def _work_count(self):
if self.id:
wrk_ordr_ids = self.env['washing.washing'].search([('laundry_obj.laundry_obj.id', '=', self.id)])
self.work_count = len(wrk_ordr_ids)
else:
self.work_count = False
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
def action_view_invoice(self):
inv_obj = self.env['account.move'].search(
[('invoice_origin', '=', self.sale_obj.name)])
inv_ids = []
for each in inv_obj:
inv_ids.append(each.id)
view_id = self.env.ref('account.view_move_form').id
if inv_ids:
if len(inv_ids) <= 1:
value = {
'view_type': 'form',
'view_mode': 'form',
'res_model': 'account.move',
'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.move',
'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'
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'
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.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('uom.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'
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._create_invoices()
elif self.advance_payment_method == 'all':
sale_orders._create_invoices()(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'}
def _create_invoice(self, order, so_line, amount):
if (
self.advance_payment_method == 'percentage' and self.amount <= 0.00) or (
self.advance_payment_method == 'fixed' and self.fixed_amount <= 0.00):
raise UserError(
_('The value of the down payment amount must be positive.'))
if self.advance_payment_method == 'percentage':
amount = order.amount_untaxed * self.amount / 100
name = _("Down payment of %s%%") % (self.amount,)
else:
amount = self.fixed_amount
name = _('Down Payment')
invoice_vals = {
'move_type': 'out_invoice',
'invoice_origin': order.name,
'invoice_user_id': order.user_id.id,
'narration': order.note,
'partner_id': order.partner_invoice_id.id,
'fiscal_position_id': order.fiscal_position_id.id or order.partner_id.property_account_position_id.id,
'partner_shipping_id': order.partner_shipping_id.id,
'currency_id': order.pricelist_id.currency_id.id,
'invoice_payment_ref': order.client_order_ref,
'invoice_payment_term_id': order.payment_term_id.id,
'team_id': order.team_id.id,
'campaign_id': order.campaign_id.id,
'medium_id': order.medium_id.id,
'source_id': order.source_id.id,
'invoice_line_ids': [(0, 0, {
'name': name,
'price_unit': amount,
'quantity': 1.0,
'product_id': self.product_id.id,
'sale_line_ids': [(6, 0, [so_line.id])],
'analytic_tag_ids': [(6, 0, so_line.analytic_tag_ids.ids)],
'analytic_account_id': order.analytic_account_id.id or False,
})],
}
if order.fiscal_position_id:
invoice_vals['fiscal_position_id'] = order.fiscal_position_id.id
invoice = self.env['account.move'].create(invoice_vals)
invoice.message_post_with_view('mail.message_origin_link',
values={'self': invoice,
'origin': order},
subtype_id=self.env.ref(
'mail.mt_note').id)
return invoice

23
laundry_management/reports/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Jesni Banu and Nilmar Shereef(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import laundry_report

98
laundry_management/reports/laundry_report.py

@ -0,0 +1,98 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Jesni Banu and Nilmar Shereef(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
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()))

19
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
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 laundry_model_access_right_user laundry_model_access_right model_laundry_order laundry_group_user 1 1 0 0
3 laundry_model_access_right_manager laundry_model_access_right1 model_laundry_order laundry_group_manager 1 1 1 1
4 laundry_order_line_model_access_right_user laundry_order_line_model_access_right model_laundry_order_line laundry_group_user 1 1 0 0
5 laundry_order_line_model_access_right_manager laundry_order_line_model_access_right1 model_laundry_order_line laundry_group_manager 1 1 1 1
6 laundry_washing_type_model_access_right_user laundry_washing_type_model_access_right model_washing_type laundry_group_user 1 0 0 0
7 laundry_washing_type_model_access_right_manager laundry_washing_type_model_access_right1 model_washing_type laundry_group_manager 1 1 1 1
8 laundry_washing_work_model_access_right_user laundry_model_washing_work_access_right model_washing_work laundry_group_user 1 0 0 0
9 laundry_washing_work_model_access_right_manager laundry_model_washing_work_access_right1 model_washing_work laundry_group_manager 1 1 1 1
10 laundry_washing_washing_model_access_right_user laundry_model_washing_washing_access_right model_washing_washing laundry_group_user 1 1 1 0
11 laundry_washing_washing_model_access_right_manager laundry_model_washing_washing_access_right1 model_washing_washing laundry_group_manager 1 1 1 1
12 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
13 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
14 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
15 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
16 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
17 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
18 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
19 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

34
laundry_management/security/laundry_security.xml

@ -0,0 +1,34 @@
<?xml version="1.0" ?>
<odoo>
<data>
<record id="module_laundry_category" model="ir.module.category">
<field name="name">Laundry</field>
<field name="sequence">18</field>
</record>
<record id="laundry_group_user" model="res.groups">
<field name="name">User</field>
<field name="category_id" ref="module_laundry_category"/>
<field name="users" eval="[(4, ref('base.group_user'))]"/>
</record>
<record id="laundry_group_manager" model="res.groups">
<field name="name">Manager</field>
<field name="implied_ids" eval="[(4, ref('laundry_group_user'))]"/>
<field name="category_id" ref="module_laundry_category"/>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
</record>
<record id="laundry_order_admin_rule" model="ir.rule">
<field name="name">laundry manager: full access</field>
<field name="model_id" ref="model_laundry_order"/>
<field name="domain_force">[(1,'=',1)]</field>
<field name="groups" eval="[(4,ref('laundry_group_manager'))]"/>
</record>
<record id="laundry_order_user_rule" model="ir.rule">
<field name="name">user: own document only</field>
<field name="model_id" ref="model_laundry_order"/>
<field name="domain_force">[('laundry_person.id','=',user.id)]</field>
<field name="groups" eval="[(4,ref('laundry_group_user'))]"/>
</record>
</data>
</odoo>

BIN
laundry_management/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
laundry_management/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
laundry_management/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
laundry_management/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
laundry_management/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
laundry_management/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
laundry_management/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
laundry_management/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
laundry_management/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
laundry_management/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
laundry_management/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
laundry_management/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
laundry_management/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
laundry_management/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
laundry_management/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
laundry_management/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
laundry_management/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
laundry_management/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
laundry_management/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
laundry_management/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
laundry_management/static/description/images/checked.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
laundry_management/static/description/images/hero.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
laundry_management/static/description/images/laundry1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
laundry_management/static/description/images/laundry10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
laundry_management/static/description/images/laundry11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
laundry_management/static/description/images/laundry2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
laundry_management/static/description/images/laundry3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
laundry_management/static/description/images/laundry4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
laundry_management/static/description/images/laundry5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
laundry_management/static/description/images/laundry6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
laundry_management/static/description/images/laundry7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
laundry_management/static/description/images/laundry8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
laundry_management/static/description/images/laundry9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
laundry_management/static/description/images/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
laundry_management/static/description/images/modules/barcode_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
laundry_management/static/description/images/modules/barcode_scan_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
laundry_management/static/description/images/modules/export_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
laundry_management/static/description/images/modules/hide_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
laundry_management/static/description/images/modules/ip_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
laundry_management/static/description/images/modules/payment_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

706
laundry_management/static/description/index.html

@ -0,0 +1,706 @@
<div class="container" style="padding: 1rem !important; margin-bottom: 1.5rem !important;">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between"
style="border-bottom: 1px solid #d5d5d5;">
<div class="my-3">
<img src="./images/logo.png" style="width: auto !important; height: 40px !important;">
</div>
<div class="my-3 d-flex align-items-center">
<div
style="background-color: #7C7BAD !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;">
<i class="fa fa-check mr-1"></i>Community
</div>
</div>
</div>
</div>
</div>
<div style="padding: 3.5rem 1.5rem !important; background-color: #ffffff !important;">
<div class="container">
<!-- HERO -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center"
style="text-align: center; padding: 1rem !important;">
<h1 class="text-center" style="color: #212121 !important; font-size: 3.5rem !important;"><span
style="font-weight: 700 !important;">Laundry Management</span></h1>
<p class="text-center"
style="color: #212529 !important; font-size: 1.5rem !important; letter-spacing: 5px !important;">
Helps You To Manage Laundry Service
</p>
<img src="./images/hero.png" class="img-responsive">
</div>
</div>
<!-- END OF HERO -->
<!-- OVERVIEW -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center"
style="text-align: center; padding: 2.5rem 1rem !important;">
<h2 style="color: #212529 !important;">Overview</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;" />
<p class="text-center" style="color: #212529 !important; font-size: 1.5rem !important;">
This is an industrial specific module by Cybrosys Technologies for Laundry Management. It
manages the laundry process with assigning works to workers.
</p>
</div>
</div>
<!-- END OF OVERVIEW -->
<!-- KEY FEATURES -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center" style="padding: 2.5rem 1rem !important;">
<h2 class="text-center" style="color: #212529 !important;">Key Features</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;" />
<div class="row">
<div class="col-lg-6">
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Recording Laundry Order.
</p>
</div>
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Make Invoices.
</p>
</div>
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Billing Facility for Extra Works.
</p>
</div>
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Detailed Laundry Work Analysis Report.
</p>
</div>
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Configuration for Washing Type.
</p>
</div>
</div>
<div class="col-lg-6">
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Assigning Works.
</p>
</div>
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Separate View for Works.
</p>
</div>
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Label Printing for Every Order.
</p>
</div>
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Access Rights From Multiple Level.
</p>
</div>
<div class="d-flex deep-2"
style="height: 60px !important; padding: 1rem 1.5rem !important; border-radius: 0 !important; margin: 1.5rem 0">
<img src="./images/checked.png" style="height: 24px !important; width: 24px !important;"
class="mt-1 mr-2" height="24px" width="24px">
<p style="color: #212529 !important; font-size: 1.3rem !important;">
Config. for Extra Works (Ironing/Patching etc.)
</p>
</div>
</div>
</div>
</div>
</div>
<!-- END OF KEY FEATURES -->
<!-- SCREENSHOTS -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center" style="padding: 2.5rem 1rem !important;">
<h2 style="text-align: center; color: #212529 !important;">Screenshots</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;" />
<!-- img -->
<div class="d-flex m-0" style="border-bottom: 1px solid #e5e5e5 !important;">
<div class="mr-3">
<h3
style="font-size: 2rem !important; font-weight: 800 !important; color: #ffffff !important; background-color: #AC1015 !important; padding: 1rem !important; width: 70px !important; height: 75px !important;">
01</h3>
</div>
<div>
<h3 style="font-size: 1.7rem !important; font-weight: 600 !important;">
Recording Laundry Order
</h3>
<p
style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
Laundry Management -> Laundry Management -> Laundry Order<br />
When you install this module, an extra menu Laundry Management will created in main
menu. Youcan 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.s
</p>
</div>
</div>
<img src="./images/laundry1.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<p style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
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.
</p>
<img src="./images/laundry2.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<img src="./images/laundry3.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<!-- endo of img -->
<!-- img -->
<div class="d-flex m-0" style="border-bottom: 1px solid #e5e5e5 !important;">
<div class="mr-3">
<h3
style="font-size: 2rem !important; font-weight: 800 !important; color: #ffffff !important; background-color: #AC1015 !important; padding: 1rem !important; width: 70px !important; height: 75px !important;">
02</h3>
</div>
<div>
<h3 style="font-size: 1.7rem !important; font-weight: 600 !important;">
Laundry Label
</h3>
<p
style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
You can print label for each order from the print menu
</p>
</div>
</div>
<img src="./images/laundry4.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<!-- endo of img -->
<!-- img -->
<div class="d-flex m-0" style="border-bottom: 1px solid #e5e5e5 !important;">
<div class="mr-3">
<h3
style="font-size: 2rem !important; font-weight: 800 !important; color: #ffffff !important; background-color: #AC1015 !important; padding: 1rem !important; width: 70px !important; height: 75px !important;">
03</h3>
</div>
<div>
<h3 style="font-size: 1.7rem !important; font-weight: 600 !important;">
Laundry Works
</h3>
<p
style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
Laundry Management -> Laundry Management -> Laundry Works</br>
This is the Separate Laundry Works Form. Here you can see the work status of Laundry
Works
</p>
</div>
</div>
<img src="./images/laundry5.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<p style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
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'
</p>
<img src="./images/laundry6.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<!-- endo of img -->
<!-- img -->
<div class="d-flex m-0" style="border-bottom: 1px solid #e5e5e5 !important;">
<div class="mr-3">
<h3
style="font-size: 2rem !important; font-weight: 800 !important; color: #ffffff !important; background-color: #AC1015 !important; padding: 1rem !important; width: 70px !important; height: 75px !important;">
04</h3>
</div>
<div>
<h3 style="font-size: 1.7rem !important; font-weight: 600 !important;">
Invoice
</h3>
<p
style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
You can create Invoice via the button 'Create Invoice' when the order reaches to 'Done'
state.
</p>
</div>
</div>
<img src="./images/laundry7.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<p style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
You can see all the Invoice through the smart button "Invoices" from the Laundry Order form.
</p>
<img src="./images/laundry8.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<!-- endo of img -->
<!-- img -->
<div class="d-flex m-0" style="border-bottom: 1px solid #e5e5e5 !important;">
<div class="mr-3">
<h3
style="font-size: 2rem !important; font-weight: 800 !important; color: #ffffff !important; background-color: #AC1015 !important; padding: 1rem !important; width: 70px !important; height: 75px !important;">
05</h3>
</div>
<div>
<h3 style="font-size: 1.7rem !important; font-weight: 600 !important;">
Configuration
</h3>
<p
style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
You can configure washing types from the menu Laundry Management -> Configuration ->
Washing Type by specifying the name, assigned person and service charge
</p>
</div>
</div>
<img src="./images/laundry9.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<p style="color: #212529 !important; font-size: 1.3rem !important; font-weight: 300 !important;">
You can configure additional works from the menu Laundry Management -> Configuration ->
Additional Works by specifying the name, assigned person and service charge
</p>
<img src="./images/laundry10.png" class="img-responsive border"
style="margin-top: -15px !important; margin-top: 1rem !important; margin-bottom: 4rem !important;">
<!-- endo of img -->
</div>
</div>
<!-- END OF SCREENSHOTS -->
<!-- SUGGESTED PRODUCTS -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center"
style="text-align: center; padding: 2.5rem 1rem !important;">
<h2 style="color: #212529 !important;">Suggested Products</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;" />
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner">
<div class="carousel-item active" style="min-height:0px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/14.0/export_stockinfo_xls/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/export_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/14.0/product_barcode/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/barcode_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/14.0/barcode_scanning_sale_purchase/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/barcode_scan_image.png">
</div>
</a>
</div>
</div>
<div class="carousel-item" style="min-height:0px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/14.0/access_restriction_by_ip/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/ip_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/14.0/account_payment_approval/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/payment_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/14.0/hide_menu_user/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./images/modules/hide_image.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="left:-25px;width: 35px;color: #000;"> <span class="carousel-control-prev-icon"><i
class="fa fa-chevron-left" style="font-size:24px"></i></span> </a> <a
class="carousel-control-next" href="#demo1" data-slide="next"
style="right:-25px;width: 35px;color: #000;">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF SUGGESTED PRODUCTS -->
<!-- OUR SERVICES -->
<section class="container" style="margin-top: 6rem !important;">
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 style="color: #212529 !important;">Our Services</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;" />
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
Licensing Consultancy</h6>
</div>
</div>
</section>
<!-- END OF END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<section class="container" style="margin-top: 6rem !important;">
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 style="color: #212529 !important;">Our Industries</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;" />
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/trading-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/education-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/service-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</section>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- FOOTER -->
<!-- Footer Section -->
<section class="container" style="margin: 5rem auto 2rem;">
<div class="row" style="max-width:1540px;">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 style="color: #212529 !important;">Need Help?</h2>
<hr
style="border: 3px solid #AC1015 !important; background-color: #AC1015 !important; width: 80px !important; margin-bottom: 2rem !important;" />
</div>
</div>
<!-- Contact Cards -->
<div class="row d-flex justify-content-center align-items-center"
style="max-width:1540px; margin: 0 auto 2rem auto;">
<div class="col-lg-12" style="padding: 0rem 3rem 2rem; border-radius: 10px; margin-right: 3rem; ">
<div class="row mt-4">
<div class="col-lg-6">
<a href="mailto:odoo@cybrosys.com" target="_blank" class="btn btn-block mb-2 deep_hover"
style="text-decoration: none; background-color: #4d4d4d; color: #FFF; border-radius: 4px;"><i
class="fa fa-envelope mr-2"></i>odoo@cybrosys.com</a>
</div>
<div class="col-lg-6">
<a href="https://api.whatsapp.com/send?phone=918606827707" target="_blank"
class="btn btn-block mb-2 deep_hover"
style="text-decoration: none; background-color: #25D366; color: #FFF; border-radius: 4px;"><i
class="fa fa-whatsapp mr-2"></i>WhatsApp</a>
</div>
</div>
</div>
</div>
<!-- End of Contact Cards -->
</section>
<!-- Footer -->
<section class="oe_container" style="padding: 2rem 3rem 1rem;">
<div class="row" style="max-width:1540px; margin: 0 auto; margin-right: 3rem; ">
<!-- Logo -->
<div class="col-lg-12 d-flex justify-content-center align-items-center" style="margin-top: 3rem;">
<img src="https://www.cybrosys.com/images/logo.png" width="200px" height="auto" />
</div>
<!-- End of Logo -->
<div class="col-lg-12">
<hr
style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
<!-- End of Footer Section -->
</div>
</div>
</section>
<!-- END OF FOOTER -->
</div>
</div>

90
laundry_management/views/config_view.xml

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="washing_type_form_view" model="ir.ui.view">
<field name="name">washing.type.form</field>
<field name="model">washing.type</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="name"/>
<field name="assigned_person"/>
</group>
<group>
<field name="amount"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="washing_type_tree_view" model="ir.ui.view">
<field name="name">washing.type.tree</field>
<field name="model">washing.type</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="assigned_person"/>
<field name="amount"/>
</tree>
</field>
</record>
<record id="action_washing_type" model="ir.actions.act_window">
<field name="name">Washing Type</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">washing.type</field>
<field name="view_mode">tree,form</field>
</record>
<record id="washing_work_form_view" model="ir.ui.view">
<field name="name">washing.work.form</field>
<field name="model">washing.work</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="name"/>
<field name="assigned_person"/>
</group>
<group>
<field name="amount"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="washing_work_tree_view" model="ir.ui.view">
<field name="name">washing.work.tree</field>
<field name="model">washing.work</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="assigned_person"/>
<field name="amount"/>
</tree>
</field>
</record>
<record id="action_washing_work" model="ir.actions.act_window">
<field name="name">Additional Works</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">washing.work</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="laundry_config_menu" name="Configuration" parent="laundry_management_menu" sequence="3"/>
<menuitem id="laundry_customer" name="Customers" parent="laundry_config_menu" action="base.action_partner_customer_form" sequence="1"/>
<menuitem id="laundry_products" name="Products" parent="laundry_config_menu" action="product.product_normal_action_sell" sequence="2"/>
<menuitem id="laundry_washing_type" name="Washing Type" parent="laundry_config_menu" action="action_washing_type" sequence="3"/>
<menuitem id="laundry_washing_work" name="Additional Works" parent="laundry_config_menu" action="action_washing_work" sequence="4"/>
</data>
</odoo>

47
laundry_management/views/laundry_label.xml

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<template id="laundry_order_label">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="obj">
<t t-call="web.external_layout">
<div class="page">
<div class="col-xs-4" style="padding:0;">
<table style="border: 2px solid black;border-spacing:0;margin-bottom:0;height:122px;" class="table">
<tbody>
<tr>
<th style="text-align: left; vertical-align: middle;" colspan="2">
<span t-esc="obj.name"/>
</th>
<th style="text-align: right; vertical-align: middle;" colspan="2">
<span t-esc="obj.order_date"/>
</th>
</tr>
<tr>
<td style="border: 2px solid black;text-align: center; vertical-align: middle;" colspan="2">
<span>CUSTOMER</span>
</td>
<td style="border: 2px solid black;text-align: center; vertical-align: middle;" colspan="2">
<span t-esc="obj.partner_id.name"/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</t>
</t>
</t>
</template>
<report
string="Laundry Order Label"
id="laundry_label"
model="laundry.order"
report_type="qweb-pdf"
name="laundry_management.laundry_order_label"
file="laundry_management.laundry_order_label"/>
</data>
</odoo>

27
laundry_management/views/laundry_report.xml

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="view_report_laundry_order" model="ir.ui.view">
<field name="name">report.laundry.order.pivot</field>
<field name="model">report.laundry.order</field>
<field name="arch" type="xml">
<pivot string="Laundry Order Analysis" display_quantity="true" disable_linking="True">
<field name="name" type="row"/>
</pivot>
</field>
</record>
<record id="action_laundry_order_analysis" model="ir.actions.act_window">
<field name="name">Laundry Order Analysis</field>
<field name="res_model">report.laundry.order</field>
<field name="view_mode">pivot</field>
<field name="context">{'group_by_no_leaf':1,'group_by':[]}</field>
<field name="help">This report allows you to analyse the performance of your Laundry Mangement. </field>
</record>
<menuitem id="laundry_report_menu" name="Report" parent="laundry_management_menu" sequence="2"/>
<menuitem name="Laundry Order Analysis" action="action_laundry_order_analysis" id="menu_laundry_order_analysis" parent="laundry_report_menu" sequence="1"/>
</data>
</odoo>

122
laundry_management/views/laundry_view.xml

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="sequence_laundry" model="ir.sequence">
<field name="name">Laundry Order Code</field>
<field name="code">laundry.order</field>
<field eval="4" name="padding" />
<field name="prefix">LO</field>
</record>
<record id="laundry_order_form_view" model="ir.ui.view">
<field name="name">laundry.order.form</field>
<field name="model">laundry.order</field>
<field name="arch" type="xml">
<form string="Laundry Order" class="o_sale_order">
<header>
<button name="confirm_order" class="oe_highlight" string="Confirm Order" type="object" states="draft"/>
<button name="create_invoice" class="oe_highlight" string="Create Invoice" type="object"
attrs="{'invisible': ['|',('invoice_status', '=', 'invoiced'), ('state', '!=', 'done')]}"/>
<button name="return_dress" string="Return" class="oe_highlight" type="object" states="done"/>
<button name="cancel_order" string="Cancel" type="object" states="draft"/>
<field name="state" widget="statusbar" statusbar_visible="draft,order,done,return"/>
</header>
<sheet>
<div class="oe_button_box" name="buttons">
<button name='action_view_laundry_works' class="oe_stat_button" type="object" icon="fa-money" states="order,done,return,process">
<field string="Works" name="work_count" widget="statinfo" />
</button>
<button name='action_view_invoice' class="oe_stat_button" type="object" icon="fa-money" states="done,return">
<field string="Invoice" name="invoice_count" widget="statinfo" />
</button>
</div>
<div class="oe_title">
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<group>
<group>
<field name="partner_id"/>
<field name="partner_invoice_id" context="{'default_type':'invoice'}"
attrs="{'readonly': [('state','in',('done','return','cancel'))]}"/>
<field name="partner_shipping_id" context="{'default_type':'delivery'}"
attrs="{'readonly': [('state','in',('done','return','cancel'))]}"/>
</group>
<group>
<field name="order_date" attrs="{'readonly': [('state','!=','draft')]}"/>
<field name="currency_id" attrs="{'readonly': [('state','!=','draft')]}"/>
<field name="laundry_person" attrs="{'readonly': [('state','in',('return', 'cancel'))]}"/>
<field name="invoice_status" invisible="1"/>
<field name="sale_obj" invisible="1"/>
</group>
</group>
<notebook>
<page string="Order Lines">
<field name="order_lines" attrs="{'readonly': [('state','!=','draft')]}">
<tree string="Laundry Order Lines" editable="bottom" decoration-info="state == 'draft'"
colors="grey:state == 'done';black:state == 'extra_work';green:state == 'wash';">
<field name="product_id"/>
<field name="description"/>
<field name="qty"/>
<field name="washing_type"/>
<field name="extra_work" widget="many2many_tags"/>
<field name="state"/>
<field name="amount"/>
</tree>
</field>
<group class="oe_subtotal_footer oe_right" colspan="2" name="laundry_total">
<field name="total_amount" widget='monetary' options="{'currency_field': 'currency_id'}"/>
</group>
<field name="note" class="oe_inline" placeholder="Setup default terms and conditions in your company settings."/>
<div class="oe_clear"/>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="laundry_order_tree_view" model="ir.ui.view">
<field name="name">laundry.order.tree</field>
<field name="model">laundry.order</field>
<field name="arch" type="xml">
<tree decoration-info="state == 'draft'">
<field name="name"/>
<field name="partner_id"/>
<field name="order_date"/>
<field name="laundry_person"/>
<field name="total_amount"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="action_laundry_order" model="ir.actions.act_window">
<field name="name">Laundry Management</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">laundry.order</field>
<field name="view_mode">tree,form</field>
<field name="domain">[]</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a New Order.
</p>
</field>
</record>
<menuitem name="Laundry Management" id="laundry_management_menu"
/>
<menuitem id="laundry_management_sub_menu" name="Laundry Management"
parent="laundry_management_menu" sequence="1"/>
<menuitem id="laundry_management_order" name="Laundry Order"
parent="laundry_management_sub_menu"
action="action_laundry_order" sequence="1"/>
</data>
</odoo>

77
laundry_management/views/washing_view.xml

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="washing_form_view" model="ir.ui.view">
<field name="name">washing.washing.form</field>
<field name="model">washing.washing</field>
<field name="arch" type="xml">
<form string="Washing" create="false">
<header>
<button name="start_wash" class="oe_highlight" string="Start" type="object" states="draft"/>
<button name="set_to_done" class="oe_highlight" string="Set to Done" type="object" states="process"/>
<field name="state" widget="statusbar" statusbar_visible="draft,process,done"/>
</header>
<sheet>
<group>
<group>
<field name="name" readonly="1"/>
<field name="user_id"/>
</group>
<group>
<field name="washing_date" readonly="1"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description"/>
</page>
<page string="Additional Products">
<field name="product_line" attrs="{'readonly': [('state','!=','draft')]}">
<tree editable="bottom">
<field name="product_id"/>
<field name="name"/>
<field name="quantity"/>
<field name="uom_id"/>
<field name="price_unit"/>
<field name="subtotal"/>
<field name="wash_obj" invisible="1"/>
</tree>
</field>
<group class="oe_subtotal_footer oe_right" colspan="2" name="product_total">
<field name="total_amount" widget='monetary'/>
</group>
<div class="oe_clear"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="washing_tree_view" model="ir.ui.view">
<field name="name">washing.washing.tree</field>
<field name="model">washing.washing</field>
<field name="arch" type="xml">
<tree create="false" edit="false" decoration-info="state == 'draft'">
<field name="name"/>
<field name="user_id"/>
<field name="washing_date"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="action_washing" model="ir.actions.act_window">
<field name="name">Washing</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">washing.washing</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('user_id','=', uid)]</field>
</record>
<menuitem id="laundry_washing" name="Laundry Works" parent="laundry_management_sub_menu" action="action_washing" sequence="2"/>
</data>
</odoo>
Loading…
Cancel
Save