Browse Source

[ADD] Initial Commit

pull/134/merge
Ajmalcybrosys 6 years ago
parent
commit
23bc64c71c
  1. 47
      barcode_scanning_sale_purchase/README.rst
  2. 23
      barcode_scanning_sale_purchase/__init__.py
  3. 43
      barcode_scanning_sale_purchase/__manifest__.py
  4. 6
      barcode_scanning_sale_purchase/doc/RELEASE_NOTES.md
  5. 24
      barcode_scanning_sale_purchase/models/__init__.py
  6. 16
      barcode_scanning_sale_purchase/models/purchase_order.py
  7. 16
      barcode_scanning_sale_purchase/models/sale_order.py
  8. BIN
      barcode_scanning_sale_purchase/static/description/banner.jpg
  9. BIN
      barcode_scanning_sale_purchase/static/description/cybro_logo.png
  10. BIN
      barcode_scanning_sale_purchase/static/description/icon.png
  11. 305
      barcode_scanning_sale_purchase/static/description/index.html
  12. BIN
      barcode_scanning_sale_purchase/static/description/product_barcode.png
  13. BIN
      barcode_scanning_sale_purchase/static/description/purchase_order.png
  14. BIN
      barcode_scanning_sale_purchase/static/description/sale_order.png
  15. 15
      barcode_scanning_sale_purchase/views/purchase_order_line.xml
  16. 15
      barcode_scanning_sale_purchase/views/sale_order_line.xml
  17. 39
      laundry_management/README.rst
  18. 24
      laundry_management/__init__.py
  19. 49
      laundry_management/__manifest__.py
  20. 7
      laundry_management/data/data.xml
  21. 9
      laundry_management/doc/RELEASE_NOTES.md
  22. 23
      laundry_management/models/__init__.py
  23. 438
      laundry_management/models/laundry.py
  24. 23
      laundry_management/reports/__init__.py
  25. 98
      laundry_management/reports/laundry_report.py
  26. 19
      laundry_management/security/ir.model.access.csv
  27. 27
      laundry_management/security/laundry_security.xml
  28. BIN
      laundry_management/static/description/additional.png
  29. BIN
      laundry_management/static/description/banner.jpg
  30. BIN
      laundry_management/static/description/cybro_logo.png
  31. BIN
      laundry_management/static/description/cybrosys-laundry-1.png
  32. BIN
      laundry_management/static/description/cybrosys-laundry-10.png
  33. BIN
      laundry_management/static/description/cybrosys-laundry-11.png
  34. BIN
      laundry_management/static/description/cybrosys-laundry-12.png
  35. BIN
      laundry_management/static/description/cybrosys-laundry-2.png
  36. BIN
      laundry_management/static/description/cybrosys-laundry-3.png
  37. BIN
      laundry_management/static/description/cybrosys-laundry-4.png
  38. BIN
      laundry_management/static/description/cybrosys-laundry-6.png
  39. BIN
      laundry_management/static/description/cybrosys-laundry-7.png
  40. BIN
      laundry_management/static/description/cybrosys-laundry-8.png
  41. BIN
      laundry_management/static/description/cybrosys-laundry-9.png
  42. BIN
      laundry_management/static/description/demo_work.png
  43. BIN
      laundry_management/static/description/icon.png
  44. 471
      laundry_management/static/description/index.html
  45. 222
      laundry_management/static/description/index.html~
  46. BIN
      laundry_management/static/description/invoice.png
  47. BIN
      laundry_management/static/description/invoice1.png
  48. BIN
      laundry_management/static/description/label.png
  49. BIN
      laundry_management/static/description/laundr_work.png
  50. BIN
      laundry_management/static/description/laundry_order.png
  51. BIN
      laundry_management/static/description/laundry_report.png
  52. BIN
      laundry_management/static/description/makeover.png
  53. BIN
      laundry_management/static/description/order.png
  54. BIN
      laundry_management/static/description/washing_type.png
  55. 90
      laundry_management/views/config_view.xml
  56. 48
      laundry_management/views/laundry_label.xml
  57. 27
      laundry_management/views/laundry_report.xml
  58. 118
      laundry_management/views/laundry_view.xml
  59. 77
      laundry_management/views/washing_view.xml
  60. 40
      sale_discount_total/README.rst
  61. 24
      sale_discount_total/__init__.py
  62. 56
      sale_discount_total/__manifest__.py
  63. 9
      sale_discount_total/doc/RELEASE_NOTES.md
  64. 25
      sale_discount_total/models/__init__.py
  65. 151
      sale_discount_total/models/account_invoice.py
  66. 82
      sale_discount_total/models/discount_approval.py
  67. 104
      sale_discount_total/models/sale.py
  68. 23
      sale_discount_total/reports/__init__.py
  69. 35
      sale_discount_total/reports/invoice_report.py
  70. 36
      sale_discount_total/reports/sale_report.py
  71. BIN
      sale_discount_total/static/description/banner.jpg
  72. BIN
      sale_discount_total/static/description/cybro_logo.png
  73. BIN
      sale_discount_total/static/description/cybrosys-sales-discount-1.png
  74. BIN
      sale_discount_total/static/description/cybrosys-sales-discount-2.png
  75. BIN
      sale_discount_total/static/description/cybrosys-sales-discount-3.png
  76. BIN
      sale_discount_total/static/description/cybrosys-sales-discount-4.png
  77. BIN
      sale_discount_total/static/description/icon.png
  78. 351
      sale_discount_total/static/description/index.html
  79. BIN
      sale_discount_total/static/description/s_d_inv.png
  80. BIN
      sale_discount_total/static/description/s_d_settings.png
  81. BIN
      sale_discount_total/static/description/s_d_so.png
  82. BIN
      sale_discount_total/static/description/s_d_state.png
  83. 41
      sale_discount_total/views/account_invoice_view.xml
  84. 20
      sale_discount_total/views/invoice_report.xml
  85. 33
      sale_discount_total/views/res_config_view.xml
  86. 21
      sale_discount_total/views/sale_order_report.xml
  87. 43
      sale_discount_total/views/sale_view.xml
  88. 38
      website_coupon/README.rst
  89. 25
      website_coupon/__init__.py
  90. 44
      website_coupon/__manifest__.py
  91. 3
      website_coupon/controllers/__init__.py
  92. 155
      website_coupon/controllers/main.py
  93. 6
      website_coupon/data/product_data.xml
  94. 6
      website_coupon/doc/RELEASE_NOTES.md
  95. 315
      website_coupon/i18n/fr.po
  96. 22
      website_coupon/models/__init__.py
  97. 88
      website_coupon/models/gift_voucher.py
  98. 10
      website_coupon/security/ir.model.access.csv
  99. BIN
      website_coupon/static/description/apply_coupon.png
  100. BIN
      website_coupon/static/description/banner.jpg

47
barcode_scanning_sale_purchase/README.rst

@ -0,0 +1,47 @@
.. image:: https://img.shields.io/badge/licence-AGPL--1-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Barcode scanning support for sale and Purchase v13
==================================================
This module will help you to use barcode scanner in sales and purchase.
Depends
=======
[sale_management] addon Odoo
[purchase] addon Odoo
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer: Sreejith P @ cybrosys, Contact: odoo@cybrosys.com
Version 13: Vaishnavi B @cybrosys,Contact: odoo@cybrosys.com
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>`__

23
barcode_scanning_sale_purchase/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Sreejith P (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

43
barcode_scanning_sale_purchase/__manifest__.py

@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Sreejith P (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': 'Barcode scanning support for sale and Purchase',
'version': '13.0.1.0.0',
'category': 'Sales',
'summary': 'This module will help you to use barcode scanner in sales and purchase.',
'author': 'Cybrosys Techno solutions',
'company': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': ['purchase', 'sale_management'],
'demo': [],
'data': [
'views/sale_order_line.xml',
'views/purchase_order_line.xml',
],
'installable': True,
'application': False,
'auto_install': False,
'images': ['static/description/banner.jpg'],
'qweb': [],
'license': 'AGPL-3',
}

6
barcode_scanning_sale_purchase/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <barcode_scanning_sale_purchase>
#### 28.10.2019
#### Version 13.0.1.0.0
##### ADD
- Migrated to version 13

24
barcode_scanning_sale_purchase/models/__init__.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Sreejith P (<https://www.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 sale_order
from . import purchase_order

16
barcode_scanning_sale_purchase/models/purchase_order.py

@ -0,0 +1,16 @@
from odoo import api, models, fields
class PurchaseOrderLines(models.Model):
_inherit = "purchase.order.line"
barcode_scan = fields.Char(string='Product Barcode', help="Here you can provide the barcode for the product")
@api.onchange('barcode_scan')
def _onchange_barcode_scan(self):
product_rec = self.env['product.product']
if self.barcode_scan:
product = product_rec.search([('barcode', '=', self.barcode_scan)])
self.product_id = product.id
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

16
barcode_scanning_sale_purchase/models/sale_order.py

@ -0,0 +1,16 @@
from odoo import api, models, fields
class SaleOrderLines(models.Model):
_inherit = 'sale.order.line'
barcode_scan = fields.Char(string='Product Barcode', help="Here you can provide the barcode for the product")
@api.onchange('barcode_scan')
def _onchange_barcode_scan(self):
product_rec = self.env['product.product']
if self.barcode_scan:
product = product_rec.search([('barcode', '=', self.barcode_scan)])
self.product_id = product.id
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

BIN
barcode_scanning_sale_purchase/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

BIN
barcode_scanning_sale_purchase/static/description/cybro_logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
barcode_scanning_sale_purchase/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

305
barcode_scanning_sale_purchase/static/description/index.html

@ -0,0 +1,305 @@
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-header-banner.png); background-repeat:no-repeat; background-size:cover;padding: 13% 0% 25% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="font-size: 35px;color: #fff;font-weight: 900;text-transform: uppercase;text-align: left;margin: 0;margin-bottom: 16px;">
Barcode scanning support for sale and Purchase
</h2>
<h3 class="oe_slogan" style="font-size: 25px;color: #fff;font-weight: 600;text-align: left;opacity: 1;margin: 0 !important;">
This module will help you to use barcode scanner in sales and purchase module.
</h3>
<h5 class="oe_slogan" style="text-align: left;background: #fff;width: 293px;padding: 10px;color: #080808 !important;opacity: 1 !important;font-weight: 600;font-size: 20px;">
<a style="color: #080808 !important;" href="https://www.cybrosys.com">Cybrosys Technologies</a>
</h5>
</div>
</section>
<section class="oe_container" style="padding: 3% 0% 3% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Overview
</h2>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
A module that can use in sales and purchase for barcode scanning.
</h3>
</div>
</section>
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-banner.png); background-repeat:no-repeat; background-size:cover;padding: 19% 0% 30% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Features
</h2>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Use barcode in Sales order
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Use barcode in Purchase order
</h3>
</div>
</section>
<section class="oe_container" style="padding: 3% 0% 0% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Screenshots
</h2>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Product Form
</h3>
<p>
&nbsp; Provide a barcode for the product.<br>
</p>
<div class="oe_row oe_spaced">
<img src="product_barcode.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Sale Order
</h3>
<p>
&nbsp; Just click on the barcode field and scan the product now the item is added to the order line.<br>
</p>
<div class="oe_row oe_spaced">
<img src="sale_order.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
>Purchase Order
</h3>
<p>
&nbsp; Just click on the barcode field and scan the product now the item is added to the order line.<br>
</p>
<div class="oe_row oe_spaced">
<img src="purchase_order.png" alt="" style="width: 95%;"/>
</div>
</div>
</section>
<section class="oe_container" style="padding: 1% 0% 0% 3%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Our Service
</h2>
<div style="display:flex;padding-top: 20px;justify-content: space-between;">
<div style="flex-basis: 18%;">
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<img src="https://www.cybrosys.com/images/odoo-customization.png" style="width: 100%;border-radius: 100%;"/>
</div>
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
Odoo <br/>Customization
</h3>
</a>
</div>
<div style="flex-basis: 18%;">
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<img src="https://www.cybrosys.com/images/odoo-erp-implementation.png" style="width: 100%;border-radius: 100%;"/>
</div>
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
Odoo <br/>Implementation
</h3>
</a>
</div>
<div style="flex-basis: 18%;">
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<img src="https://www.cybrosys.com/images/odoo-erp-integration.png" style="width: 100%;border-radius: 100%;"/>
</div>
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
Odoo <br/>Integration
</h3>
</a>
</div>
<div style="flex-basis: 18%;">
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<img src="https://www.cybrosys.com/images/odoo-erp-support.png" style="width: 100%;border-radius: 100%;"/>
</div>
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
Odoo <br/>Support
</h3>
</a>
</div>
<div style="flex-basis: 18%;">
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<img src="https://www.cybrosys.com/images/hire-odoo-developer.png" style="width: 100%;border-radius: 100%;"/>
</div>
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
Hire <br/>Odoo Developer
</h3>
</a>
</div>
</div>
</div>
</section>
<section class="oe_container" style="padding: 3% 0% 0% 3%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Our Industries
</h2>
<div style="display:flex;justify-content: space-between;flex-wrap:wrap;">
<div style="flex-basis: 32%;padding-top: 20px;">
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<img src="https://www.cybrosys.com/images/odoo-index-industry-1.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
Trading
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Easily procure and sell your products.
</h3>
</div>
</a>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<img src="https://www.cybrosys.com/images/odoo-index-industry-2.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
Manufacturing
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Plan, track and schedule your operations.
</h3>
</div>
</a>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<img src="https://www.cybrosys.com/images/odoo-index-industry-3.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
Restaurant
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Run your bar or restaurant methodical.
</h3>
</div>
</a>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<img src="https://www.cybrosys.com/images/odoo-index-industry-4.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
POS
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Easy configuring and convivial selling.
</h3>
</div>
</a>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<img src="https://www.cybrosys.com/images/odoo-index-industry-5.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 0px;margin-left: 16px;">
E-commerce & Website
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Mobile friendly, awe-inspiring product pages.
</h3>
</div>
</a>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<img src="https://www.cybrosys.com/images/odoo-index-industry-6.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
Hotel Management
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
An all-inclusive hotel management application.
</h3>
</div>
</a>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<img src="https://www.cybrosys.com/images/odoo-index-industry-7.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
Education
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
A Collaborative platform for educational management.
</h3>
</div>
</a>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<img src="https://www.cybrosys.com/images/odoo-index-industry-8.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
Service Management
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Keep track of services and invoice accordingly.
</h3>
</div>
</a>
</div>
</div>
</div>
</section>
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-footer-bg.png); background-repeat:no-repeat; background-size:100%;padding: 13% 0% 6% 0%;">
<div class="oe_slogan" style="margin-top:10px !important;margin-bottom: 0px;">
<div>
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 14px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com"><i class="fa fa-envelope"></i> Email us </a>
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 14px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-phone"></i> Contact Us </a>
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 14px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/odoo-customization-and-installation/"><i class="fa fa-check-square"></i> Request Customization </a>
</div>
<br>
<img src="https://www.cybrosys.com/images/logo.png" style="width: 190px; margin-bottom: 25px;margin-top: 30px;" class="center-block">
<div>
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px; ;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
</div>
</div>
</section>

BIN
barcode_scanning_sale_purchase/static/description/product_barcode.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

BIN
barcode_scanning_sale_purchase/static/description/purchase_order.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

BIN
barcode_scanning_sale_purchase/static/description/sale_order.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

15
barcode_scanning_sale_purchase/views/purchase_order_line.xml

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="purchase_order_view_inherit_barcode1" model="ir.ui.view">
<field name="name">purchase.order.form.inherit</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/tree/field[@name='product_id']" position="before">
<field name ="barcode_scan"/>
</xpath>
</field>
</record>
</data>
</odoo>

15
barcode_scanning_sale_purchase/views/sale_order_line.xml

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="sale_order_view_inherit_barcode1" model="ir.ui.view">
<field name="name">sale.order.form.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/tree/field[@name='product_id']" position="before">
<field name ="barcode_scan"/>
</xpath>
</field>
</record>
</data>
</odoo>

39
laundry_management/README.rst

@ -0,0 +1,39 @@
Laundry Management v13
======================
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
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

49
laundry_management/__manifest__.py

@ -0,0 +1,49 @@
# -*- 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/>.
#
#############################################################################
{
'name': 'Laundry Management',
'version': '13.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,
}

7
laundry_management/data/data.xml

@ -0,0 +1,7 @@
<?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>
</record>
</odoo>

9
laundry_management/doc/RELEASE_NOTES.md

@ -0,0 +1,9 @@
## Module <laundry_management>
#### 28.10.2019
#### Version 13.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

438
laundry_management/models/laundry.py

@ -0,0 +1,438 @@
# -*- 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):
wrk_ordr_ids = self.env['washing.washing'].search([('laundry_obj.laundry_obj.id', '=', self.id)])
self.work_count = len(wrk_ordr_ids)
def action_view_laundry_works(self):
work_obj = self.env['washing.washing'].search([('laundry_obj.laundry_obj.id', '=', self.id)])
print(work_obj)
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('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'
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 = {
'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

27
laundry_management/security/laundry_security.xml

@ -0,0 +1,27 @@
<?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>
</data>
</odoo>
<!--id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink-->
<!--access_washing_type,washing.type.user,model_washing_type,base.group_user,1,0,0,0-->
<!--access_washing_type,washing.type.manager,model_washing_type,base.group_system,1,1,1,1-->

BIN
laundry_management/static/description/additional.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

BIN
laundry_management/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

BIN
laundry_management/static/description/cybro_logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
laundry_management/static/description/cybrosys-laundry-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

BIN
laundry_management/static/description/cybrosys-laundry-10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

BIN
laundry_management/static/description/cybrosys-laundry-11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

BIN
laundry_management/static/description/cybrosys-laundry-12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
laundry_management/static/description/cybrosys-laundry-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

BIN
laundry_management/static/description/cybrosys-laundry-3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
laundry_management/static/description/cybrosys-laundry-4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
laundry_management/static/description/cybrosys-laundry-6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
laundry_management/static/description/cybrosys-laundry-7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

BIN
laundry_management/static/description/cybrosys-laundry-8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
laundry_management/static/description/cybrosys-laundry-9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
laundry_management/static/description/demo_work.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
laundry_management/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

471
laundry_management/static/description/index.html

@ -0,0 +1,471 @@
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-header-banner.png);background-repeat:no-repeat;background-size:100%;padding: 4% 0% 2% 15%;background-position-y: -107px;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="font-size: 35px;color: #fff;font-weight: 900;text-transform: uppercase;text-align: left;margin: 0;margin-bottom: 16px;">
Laundry Service Management
</h2>
<h3 class="oe_slogan" style="font-size: 25px;color: #fff;font-weight: 600;text-align: left;opacity: 1;margin: 0 !important;">
Cybrosys Industrial Module Which Helps You To Manage Laundry Service
</h3>
<h5 class="oe_slogan" style="text-align: left;background: #fff;width: 293px;padding: 10px;color: #080808 !important;opacity: 1 !important;font-weight: 600;font-size: 20px;">
<a style="color: #080808 !important;" href="https://www.cybrosys.com" target="_blank">Cybrosys Technologies</a>
</h5>
<a style="color: #080808 !important;" href="https://www.cybrosys.com" target="_blank">
<div style="width: 215px;margin-left: 57%;text-align: center;background: #ffffff;height: 215px;border-radius: 100%;display: flex;justify-content: center;align-items: center;box-shadow: 0 0 12px 4px #00000059;">
<img src="https://www.cybrosys.com/images/cybro-logo-oca.png" alt="cybrosys technologies" style="width: 180px;"/>
</div>
</a>
</div>
</section>
<section class="oe_container" style="padding: 3% 0% 3% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Overview
</h2>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
This is an industrial specific module by <a href="https://www.cybrosys.com">Cybrosys Technologies</a>
for Laundry Management. It manages
the laundry process with assigning works to workers.
</h3>
<br/>
<h3 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;padding: 2% 0% 0% 0%;">
Configuration
</h3>
<h3 class="oe_slogan" style="text-align: left;padding: 0% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<b>Access Rights</b>
<br/>
<span>Laundry Manager : Laundry manager have all the access across the fleet rental management <br/></span>
<span>Laundry User : Laundry user can read, write and create the records.</span>
</h3>
</div>
</section>
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-banner.png); background-repeat:no-repeat; background-size:cover;padding: 19% 0% 30% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Features
</h2>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Recording Laundry Order.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Assigning Works.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Make Invoices.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Separate View for Works.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Billing Facility for Extra Works.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Label Printing for Every Order.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Detailed Laundry Work Analysis Report.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Access Rights From Multiple Level.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Configuration for Washing Type.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Configuration for Extra Works (Ironing/Patching etc..).
</h3>
</div>
</section>
<section class="oe_container" style="padding: 3% 0% 0% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Screenshots
</h2>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Recording Laundry Order
</h3>
<div>
<h4>Laundry Management -> Laundry Management -> Laundry Order</h4>
</div>
<span>
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.
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-1.png" alt="" style="width: 95%;"/>
</div>
<span>
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.
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-2.png" alt="" style="width: 95%;"/>
</div><div class="oe_row oe_spaced">
<img src="cybrosys-laundry-3.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Laundry Label
</h3>
<span>
You can print label for each order from the print menu.
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-4.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Laundry Works
</h3>
<div>
<h4>Laundry Management -> Laundry Management -> Laundry Works</h4>
</div>
<span>
This is the Separate Laundry Works Form. Here you can see the work status of Laundry Works.
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-6.png" alt="" style="width: 95%;"/>
</div>
<span>
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'.
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-7.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Invoice
</h3>
<span>
You can create Invoice via the button 'Create Invoice' when the order reaches to 'Done' state.
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-8.png" alt="" style="width: 95%;"/>
</div>
<span>
You can see all the Invoice through the smart button "Invoices" from the Laundry Order form.
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-9.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Configuration
</h3>
<span>
You can configure washing types from the menu Laundry Management -> Configuration -> Washing Type by
specifying the name, assigned person and service charge
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-10.png" alt="" style="width: 95%;"/>
</div>
<span>
You can configure additional works from the menu Laundry Management -> Configuration -> Additional Works by
specifying the name, assigned person and service charge
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-11.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Laundry Work Analysis Report
</h3>
<span>
You can also analyse your all Laundry Works from Laundry Management -> Report -> Laundry Order Analysis.
</span>
<div class="oe_row oe_spaced">
<img src="cybrosys-laundry-12.png" alt="" style="width: 95%;"/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<br/>
<h2 class="oe_slogan" style="margin-top:20px;" >You Looking for a functional Documentation of this Application.?</h2>
<h3 class="oe_slogan">Give a Request Mail to:&nbsp;&nbsp;<i class="fa fa-envelope" aria-hidden="true"></i>&nbsp;&nbsp;<a href="#" style="color:blue;">odoo@cybrosys.com</a></h3>
<br/>
<br/>
</section>
<section class="oe_container" style="padding: 7px 0% 0% 3%;">
<div class="oe_row oe_spaced">
<a style="color: #080808 !important;" href="https://apps.odoo.com/apps/modules/browse?search=cybrosys" target="_blank"><img src="https://www.cybrosys.com/images/view-more-apps.jpg" alt="cybrosys technologies" style="width: 100%;margin-bottom: 50px;"/></a>
</div>
</section>
<section class="oe_container" style="padding: 1% 0% 0% 3%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Our Services
</h2>
<div style="display:flex;padding-top: 20px;justify-content: space-between;">
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-customization.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank">
Odoo Customization
</a>
</h3>
</div>
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-erp-implementation.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank">
Odoo Implementation </a>
</h3>
</div>
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-erp-integration.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank">
Odoo Integration
</a>
</h3>
</div>
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-erp-support.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank">
Odoo Support</a>
</h3>
</div>
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank">
<img src="https://www.cybrosys.com/images/hire-odoo-developer.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank">
Hire Odoo Developers</a>
</h3>
</a>
</div>
</div>
</div>
</section>
<section class="oe_container" style="padding: 1% 0% 0% 3%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Our Industries
</h2>
<div style="display:flex;justify-content: space-between;flex-wrap:wrap;">
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-1.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank">
Trading
</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Easily procure and sell your products.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-2.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank">
Manufacturing</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Plan, track and schedule your operations.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-3.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank">
Restaurant</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Run your bar or restaurant methodical.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-4.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank">
POS</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Easy configuring and convivial selling.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-5.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 0px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank">
E-commerce & Website</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Mobile friendly, awe-inspiring product pages.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-6.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank">
Hotel Management</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
An all-inclusive hotel management application.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-7.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank">
Education</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
A Collaborative platform for educational management.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-8.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank">
Service Management</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Keep track of services and invoice accordingly.
</h3>
</div>
</div>
</div>
</div>
</section>
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-footer-bg.png); background-repeat:no-repeat; background-size:100%;padding: 13% 0% 6% 0%;">
<div class="oe_slogan" style="margin-top:10px !important;margin-bottom: 0px;">
<div>
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="mailto:odoo@cybrosys.com"><i class="fa fa-envelope"></i> Email us </a>
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-phone"></i> Contact Us </a>
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-check-square"></i> Request Customization </a>
</div>
<br>
<img src="https://www.cybrosys.com/images/logo.png" style="width: 190px; margin-bottom: 25px;margin-top: 30px;" class="center-block">
<div>
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px; ;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
</div>
</div>
</section>

222
laundry_management/static/description/index.html~

@ -0,0 +1,222 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">Laundry Service Management</h2>
<h3 class="oe_slogan">Cybrosys Industrial Module Which Helps You To Manage Laundry Service</h3>
<h4 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a> </h4>
</div>
<div class="oe_row oe_spaced" style="padding-left:65px;">
<h4>Features:</h4>
<div>
<span style="color:green;"> &#9745; </span> Recording Laundry Order.<br/>
<span style="color:green;"> &#9745; </span> Assigning Works.<br/>
<span style="color:green;"> &#9745; </span> Make Invoices.<br/>
<span style="color:green;"> &#9745; </span> Separate View for Works.<br/>
<span style="color:green;"> &#9745; </span> Billing Facility for Extra Works.<br/>
<span style="color:green;"> &#9745; </span> Label Printing for Every Order.<br/>
<span style="color:green;"> &#9745; </span> Detailed Laundry Work Analysis Report.<br/>
<span style="color:green;"> &#9745; </span> Access Rights From Multiple Level.<br/>
<span style="color:green;"> &#9745; </span> Configuration for Washing Type.<br/>
<span style="color:green;"> &#9745; </span> Configuration for Extra Works (Ironing/Patching etc..).<br/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_picture">
<h3 class="oe_slogan">Overview</h3>
<p class="oe_mt32" style="text-align: center;">
This is an industrial specific module by <a href="https://www.cybrosys.com">Cybrosys Technologies</a>
for Laundry Management. It manages
the laundry process with assigning works to workers.
</p>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan">Recording Laundry Order</h3>
<div style="text-align: center">
<p>
<h4>Laundry Management -> Laundry Management -> Laundry Order</h4>
<p>
<span style="text-align: center;padding-left:65px;">&#9755; 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.
</span>
</div>
<div style="text-align: center">
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;height: 400px;" src="laundry_order.png">
</div>
</div>
<div class="" style="text-align: center">
<div style="padding-left:65px;">
<span>&#9755; 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.</span>
</div>
<div class="oe_row oe_padded">
<div class="oe_span6">
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;" src="laundr_work.png">
</div>
</div>
<div class="oe_span6">
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;" src="demo_work.png">
</div>
</div>
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan">Laundry Label</h3>
<div class="" style="text-align: center">
<div style="padding-left:65px;">
<span>&#9755; You can print label for each order from the print menu.</span>
</div>
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;" src="label.png">
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan">Laundry Works</h3>
<div class="" style="text-align: center">
<div class="" style="text-align: center">
<p>
<h4>Laundry Management -> Laundry Management -> Laundry Works</h4>
<p>
</div>
<div style="padding-left:65px;">
<span>&#9755; This is the Separate Laundry Works Form. Here you can see the work status of Laundry Works.</span>
</div>
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;" src="order.png">
</div>
<div style="padding-left:65px;">
<span>&#9755; 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'.</span>
</div>
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;" src="makeover.png">
</div>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan">Invoice</h3>
<div class="" style="text-align: center">
<span>&#9755;
You can create Invoice via the button 'Create Invoice' when the order reaches to 'Done' state.
</span>
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;height:400px;" src="invoice1.png">
</div>
</div>
<div class="" style="text-align: center">
<span>&#9755;
You can see all the Invoice through the smart button "Invoices" from the Laundry Order form.
</span>
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;height:400px;" src="invoice.png">
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan">Configuration</h3>
<div class="" style="text-align: center">
<span>&#9755;
You can configure washing types from the menu Laundry Management -> Configuration -> Washing Type by
specifying the name, assigned person and service charge
</span>
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;height:400px;" src="washing_type.png">
</div>
</div>
<div class="" style="text-align: center">
<span>&#9755;
You can configure additional works from the menu Laundry Management -> Configuration -> Additional Works by
specifying the name, assigned person and service charge
</span>
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;height:400px;" src="additional.png">
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan">Laundry Work Analysis Report</h3>
<div class="" style="text-align: center">
<span>&#9755;
You can also analyse your all Laundry Works from Laundry Management -> Report -> Laundry Order Analysis.
</span>
<div class="oe_demo oe_picture oe_screenshot">
<img style="border:10px solid white;height:400px;" src="laundry_report.png">
</div>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan">Access Rights</h3>
<div class="" style="padding-left:65px;">
<span>&#9755;Laundry Manager :- Laundry manager have all the access across the fleet rental management <br/></span>
<span>&#9755;Laundry User :- Laundry user can read, write and create the records.</span>
</div>
</div>
</section>
<section class="oe_container">
<br/>
<h2 class="oe_slogan" style="margin-top:20px;" >You Looking for a functional Documentation of this Application.?</h2>
<h3 class="oe_slogan">Give a Request Mail to:&nbsp;&nbsp;<i class="fa fa-envelope" aria-hidden="true"></i>&nbsp;&nbsp;<a href="#" style="color:blue;">odoo@cybrosys.com</a></h3>
<br/>
<br/>
</section>
<section class="oe_container oe_dark">
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2>
<div class="oe_slogan" style="margin-top:10px !important;">
<div>
<a class="btn btn-primary btn-lg mt8"
style="color: #FFFFFF !important;border-radius: 0;" href="http://www.cybrosys.com"><i
class="fa fa-envelope"></i> Email </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;"
href="http://www.cybrosys.com/contact/"><i
class="fa fa-phone"></i> Contact Us </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;"
href="http://www.cybrosys.com/odoo-customization-and-installation/"><i
class="fa fa-check-square"></i> Request Customization </a>
</div>
<br>
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block">
<div>
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;"></i></a></td>
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;"></i></a></td>
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px;padding-left: 8px;"></i></a></td>
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;"></i></a></td>
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;"></i></a></td>
</div>
</div>
</section>

BIN
laundry_management/static/description/invoice.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
laundry_management/static/description/invoice1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
laundry_management/static/description/label.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
laundry_management/static/description/laundr_work.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

BIN
laundry_management/static/description/laundry_order.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

BIN
laundry_management/static/description/laundry_report.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
laundry_management/static/description/makeover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

BIN
laundry_management/static/description/order.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
laundry_management/static/description/washing_type.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

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>

48
laundry_management/views/laundry_label.xml

@ -0,0 +1,48 @@
<?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>

118
laundry_management/views/laundry_view.xml

@ -0,0 +1,118 @@
<?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">[('laundry_person','=', uid)]</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" icon="fa-car"/>
<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>

40
sale_discount_total/README.rst

@ -0,0 +1,40 @@
Sale Discount on Total Amount
=============================
Discount on Total in Sale and Invoice With Discount Limit and Approval
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer: Faslu Rahman@cybrosys
Version 13: Nimisha Murali@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
sale_discount_total/__init__.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Faslu Rahman(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

56
sale_discount_total/__manifest__.py

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Faslu Rahman(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': 'Sale Discount on Total Amount',
'version': '13.0.1.0.0',
'category': 'Sales Management',
'summary': "Discount on Total in Sale and Invoice With Discount Limit and Approval",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'website': 'http://www.cybrosys.com',
'description': """
Sale Discount for Total Amount
=======================
Module to manage discount on total amount in Sale.
as an specific amount or percentage
""",
'depends': ['sale',
'account', 'delivery'
],
'data': [
'views/sale_view.xml',
'views/account_invoice_view.xml',
'views/invoice_report.xml',
'views/sale_order_report.xml',
'views/res_config_view.xml',
],
'demo': [
],
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'application': True,
'installable': True,
'auto_install': False,
}

9
sale_discount_total/doc/RELEASE_NOTES.md

@ -0,0 +1,9 @@
## Module <inventory_barcode_scanning>
#### 15.10.2019
#### Version 13.0.1.0.0
#### ADD
Initial commit for Sale Discount On Total Amount

25
sale_discount_total/models/__init__.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Faslu Rahman(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 sale
from . import account_invoice
from . import discount_approval

151
sale_discount_total/models/account_invoice.py

@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Faslu Rahman(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 api, fields, models
class AccountInvoice(models.Model):
_inherit = "account.move"
@api.depends(
'line_ids.debit',
'line_ids.credit',
'line_ids.amount_currency',
'line_ids.amount_residual',
'line_ids.amount_residual_currency',
'line_ids.payment_id.state')
def _compute_amount(self):
invoice_ids = [move.id for move in self if move.id and move.is_invoice(include_receipts=True)]
self.env['account.payment'].flush(['state'])
if invoice_ids:
self._cr.execute(
'''
SELECT move.id
FROM account_move move
JOIN account_move_line line ON line.move_id = move.id
JOIN account_partial_reconcile part ON part.debit_move_id = line.id OR part.credit_move_id = line.id
JOIN account_move_line rec_line ON
(rec_line.id = part.credit_move_id AND line.id = part.debit_move_id)
OR
(rec_line.id = part.debit_move_id AND line.id = part.credit_move_id)
JOIN account_payment payment ON payment.id = rec_line.payment_id
JOIN account_journal journal ON journal.id = rec_line.journal_id
WHERE payment.state IN ('posted', 'sent')
AND journal.post_at = 'bank_rec'
AND move.id IN %s
''', [tuple(invoice_ids)]
)
in_payment_set = set(res[0] for res in self._cr.fetchall())
else:
in_payment_set = {}
for move in self:
total_untaxed = 0.0
total_untaxed_currency = 0.0
total_tax = 0.0
total_tax_currency = 0.0
total_residual = 0.0
total_residual_currency = 0.0
currencies = set()
for line in move.line_ids:
if line.currency_id:
currencies.add(line.currency_id)
# Untaxed amount.
if (move.is_invoice(include_receipts=True) and not line.exclude_from_invoice_tab) \
or (move.type == 'entry' and line.debit and not line.tax_line_id):
total_untaxed += line.balance
total_untaxed_currency += line.amount_currency
# Tax amount.
if line.tax_line_id:
total_tax += line.balance
total_tax_currency += line.amount_currency
# Residual amount.
if move.type == 'entry' or line.account_id.user_type_id.type in ('receivable', 'payable'):
total_residual += line.amount_residual
total_residual_currency += line.amount_residual_currency
total = total_untaxed + total_tax
total_currency = total_untaxed_currency + total_tax_currency
if move.type == 'entry' or move.is_outbound():
sign = 1
else:
sign = -1
move.amount_discount = sum((line.quantity * line.price_unit * line.discount)/100 for line in move.line_ids)
move.amount_untaxed = sign * (total_untaxed_currency if len(currencies) == 1 else total_untaxed)
move.amount_tax = sign * (total_tax_currency if len(currencies) == 1 else total_tax)
move.amount_total = sign * (total_currency if len(currencies) == 1 else total)
move.amount_residual = -sign * (total_residual_currency if len(currencies) == 1 else total_residual)
move.amount_untaxed_signed = -total_untaxed
move.amount_tax_signed = -total_tax
move.amount_total_signed = -total
move.amount_residual_signed = total_residual
currency = len(currencies) == 1 and currencies.pop() or move.company_id.currency_id
is_paid = currency and currency.is_zero(move.amount_residual) or not move.amount_residual
# Compute 'invoice_payment_state'.
if move.state == 'posted' and is_paid:
if move.id in in_payment_set:
move.invoice_payment_state = 'in_payment'
else:
move.invoice_payment_state = 'paid'
else:
move.invoice_payment_state = 'not_paid'
discount_type = fields.Selection([('percent', 'Percentage'), ('amount', 'Amount')], string='Discount Type',
readonly=True, states={'draft': [('readonly', False)]}, default='percent')
discount_rate = fields.Float('Discount Amount', digits=(16, 2), readonly=True, states={'draft': [('readonly', False)]})
amount_discount = fields.Monetary(string='Discount', store=True, readonly=True, compute='_compute_amount',
track_visibility='always')
@api.onchange('discount_type', 'discount_rate', 'invoice_line_ids')
def supply_rate(self):
for inv in self:
if inv.discount_type == 'percent':
for line in inv.line_ids:
line.discount = inv.discount_rate
else:
total = discount = 0.0
for line in inv.invoice_line_ids:
total += (line.quantity * line.price_unit)
if inv.discount_rate != 0:
discount = (inv.discount_rate / total) * 100
else:
discount = inv.discount_rate
for line in inv.invoice_line_ids:
line.discount = discount
def button_dummy(self):
self.supply_rate()
return True
class AccountInvoiceLine(models.Model):
_inherit = "account.move.line"
discount = fields.Float(string='Discount (%)', digits=(16, 20), default=0.0)

82
sale_discount_total/models/discount_approval.py

@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Faslu Rahman(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 api, fields, models
class sale_discount(models.Model):
_inherit = 'sale.order'
state = fields.Selection([
('draft', 'Quotation'),
('sent', 'Quotation Sent'),
('waiting', 'Waiting Approval'),
('sale', 'Sales Order'),
('done', 'Locked'),
('cancel', 'Cancelled'),
], string='Status', readonly=True, copy=False, index=True, track_visibility='onchange', default='draft')
def action_confirm(self):
discnt = 0.0
no_line = 0.0
if self.company_id.so_double_validation == 'two_step':
for line in self.order_line:
no_line += 1
discnt += line.discount
discnt = (discnt / no_line)
if self.company_id.so_double_validation_limit and discnt > self.company_id.so_double_validation_limit:
self.state = 'waiting'
return True
super(sale_discount, self).action_confirm()
def action_approve(self):
super(sale_discount, self).action_confirm()
return True
class Company(models.Model):
_inherit = 'res.company'
so_double_validation = fields.Selection([
('one_step', 'Confirm sale orders in one step'),
('two_step', 'Get 2 levels of approvals to confirm a sale order')
], string="Levels of Approvals", default='one_step',
help="Provide a double validation mechanism for sales discount")
so_double_validation_limit = fields.Float(string="Percentage of Discount that requires double validation'",
help="Minimum discount percentage for which a double validation is required")
class ResDiscountSettings(models.TransientModel):
_inherit = 'res.config.settings'
so_order_approval = fields.Boolean("Sale Discount Approval", default=lambda self: self.env.user.company_id.so_double_validation == 'two_step')
so_double_validation = fields.Selection(related='company_id.so_double_validation',string="Levels of Approvals *", readonly=False)
so_double_validation_limit = fields.Float(string="Discount limit requires approval in %",
related='company_id.so_double_validation_limit', readonly=False)
def set_values(self):
super(ResDiscountSettings, self).set_values()
self.so_double_validation = 'two_step' if self.so_order_approval else 'one_step'

104
sale_discount_total/models/sale.py

@ -0,0 +1,104 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Faslu Rahman(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 api, fields, models
import odoo.addons.decimal_precision as dp
class SaleOrder(models.Model):
_inherit = "sale.order"
@api.depends('order_line.price_total')
def _amount_all(self):
"""
Compute the total amounts of the SO.
"""
for order in self:
amount_untaxed = amount_tax = amount_discount = 0.0
for line in order.order_line:
amount_untaxed += line.price_subtotal
amount_tax += line.price_tax
amount_discount += (line.product_uom_qty * line.price_unit * line.discount) / 100
order.update({
'amount_untaxed': amount_untaxed,
'amount_tax': amount_tax,
'amount_discount': amount_discount,
'amount_total': amount_untaxed + amount_tax,
})
discount_type = fields.Selection([('percent', 'Percentage'), ('amount', 'Amount')], string='Discount type',
readonly=True,states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
default='percent')
discount_rate = fields.Float('Discount Rate', digits=dp.get_precision('Account'),
readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]})
amount_untaxed = fields.Monetary(string='Untaxed Amount', store=True, readonly=True, compute='_amount_all',
track_visibility='always')
amount_tax = fields.Monetary(string='Taxes', store=True, readonly=True, compute='_amount_all',
track_visibility='always')
amount_total = fields.Monetary(string='Total', store=True, readonly=True, compute='_amount_all',
track_visibility='always')
amount_discount = fields.Monetary(string='Discount', store=True, readonly=True, compute='_amount_all',
digits=dp.get_precision('Account'), track_visibility='always')
@api.onchange('discount_type', 'discount_rate', 'order_line')
def supply_rate(self):
for order in self:
if order.discount_type == 'percent':
for line in order.order_line:
line.discount = order.discount_rate
else:
total = discount = 0.0
for line in order.order_line:
total += round((line.product_uom_qty * line.price_unit))
if order.discount_rate != 0:
discount = (order.discount_rate / total) * 100
else:
discount = order.discount_rate
for line in order.order_line:
line.discount = discount
def _prepare_invoice(self,):
invoice_vals = super(SaleOrder, self)._prepare_invoice()
invoice_vals.update({
'discount_type': self.discount_type,
'discount_rate': self.discount_rate,
})
return invoice_vals
def button_dummy(self):
self.supply_rate()
return True
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"
discount = fields.Float(string='Discount (%)', digits=(16, 20), default=0.0)

23
sale_discount_total/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: Faslu Rahman(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 invoice_report
from . import sale_report

35
sale_discount_total/reports/invoice_report.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Faslu Rahman(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 fields, models
class AccountInvoiceReport(models.Model):
_inherit = 'account.invoice.report'
discount = fields.Float('Discount', readonly=True)
def _select(self):
res = super(AccountInvoiceReport,self)._select()
select_str = res + """, line.discount AS discount """
return select_str

36
sale_discount_total/reports/sale_report.py

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Faslu Rahman(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 fields, models
class DiscountSaleReport(models.Model):
_inherit = 'sale.report'
discount = fields.Float('Discount', readonly=True)
def _select(self):
res = super(DiscountSaleReport,self)._select()
select_str = res+""",sum(l.product_uom_qty / u.factor * u2.factor * cr.rate * l.price_unit * l.discount / 100.0)
as discount"""
return select_str

BIN
sale_discount_total/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
sale_discount_total/static/description/cybro_logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
sale_discount_total/static/description/cybrosys-sales-discount-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
sale_discount_total/static/description/cybrosys-sales-discount-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
sale_discount_total/static/description/cybrosys-sales-discount-3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
sale_discount_total/static/description/cybrosys-sales-discount-4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
sale_discount_total/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

351
sale_discount_total/static/description/index.html

@ -0,0 +1,351 @@
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-header-banner.png);background-repeat:no-repeat;background-size:100%;padding: 4% 0% 2% 15%;background-position-y: -107px;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="font-size: 35px;color: #fff;font-weight: 900;text-transform: uppercase;text-align: left;margin: 0;margin-bottom: 16px;">
Global Discount In Sale
</h2>
<h3 class="oe_slogan" style="font-size: 25px;color: #fff;font-weight: 600;text-align: left;opacity: 1;margin: 0 !important;">
Global Discount In Sale
</h3>
<h5 class="oe_slogan" style="text-align: left;background: #fff;width: 293px;padding: 10px;color: #080808 !important;opacity: 1 !important;font-weight: 600;font-size: 20px;">
<a style="color: #080808 !important;" href="https://www.cybrosys.com">Cybrosys Technologies</a>
</h5>
<a style="color: #080808 !important;" href="https://www.cybrosys.com" target="_blank">
<div style="width: 215px;margin-left: 57%;text-align: center;background: #ffffff;height: 215px;border-radius: 100%;display: flex;justify-content: center;align-items: center;box-shadow: 0 0 12px 4px #00000059;">
<img src="https://www.cybrosys.com/images/cybro-logo-oca.png" alt="cybrosys technologies" style="width: 180px;"/>
</div>
</a>
</div>
</section>
<section class="oe_container" style="padding: 3% 0% 3% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Overview
</h2>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
This module allows you to mention discount on Total of sale order and Total of Customer Invoice as percentage or as amount.
</h3>
</div>
</section>
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-banner.png); background-repeat:no-repeat; background-size:cover;padding: 19% 0% 30% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Features
</h2>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Select 'Percentage' from Discount type and give discount percentage as Discount rate.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Select 'Amount' from Discount type and give discount amount as Discount rate.
</h3>
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
System will update the value of Discount and Total
</h3>
</div>
</section>
<section class="oe_container" style="padding: 3% 0% 0% 15%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Screenshots
</h2>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Sale Order
</h3>
<div class="oe_row oe_spaced">
<img src="cybrosys-sales-discount-1.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Customer Invoice
</h3>
<div class="oe_row oe_spaced">
<img src="cybrosys-sales-discount-2.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
And the module also allows you to set a limit for total discount in percentage. Exceeding this limit
will require approval.
</h3>
<div class="oe_row oe_spaced">
<img src="cybrosys-sales-discount-3.png" alt="" style="width: 95%;"/>
</div>
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;">
<img src="https://www.cybrosys.com/images/ico-tick.png">
Manager level users can approve sale orders in 'Waiting Approval' stage.
</h3>
<div class="oe_row oe_spaced">
<img src="cybrosys-sales-discount-4.png" alt="" style="width: 95%;"/>
</div>
</div>
</section>
<section class="oe_container" style="padding: 7px 0% 0% 3%;">
<div class="oe_row oe_spaced">
<a style="color: #080808 !important;" href="https://apps.odoo.com/apps/modules/browse?search=cybrosys" target="_blank"><img src="https://www.cybrosys.com/images/view-more-apps.jpg" alt="cybrosys technologies" style="width: 100%;margin-bottom: 50px;"/></a>
</div>
</section>
<section class="oe_container" style="padding: 1% 0% 0% 3%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Our Services
</h2>
<div style="display:flex;padding-top: 20px;justify-content: space-between;">
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-customization.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank">
Odoo Customization
</a>
</h3>
</div>
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-erp-implementation.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank">
Odoo Implementation </a>
</h3>
</div>
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-erp-integration.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank">
Odoo Integration
</a>
</h3>
</div>
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-erp-support.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank">
Odoo Support</a>
</h3>
</div>
<div style="flex-basis: 18%;">
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;">
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank">
<img src="https://www.cybrosys.com/images/hire-odoo-developer.png" style="width: 100%;border-radius: 100%;"/>
</a>
</div>
<h3 class="oe_slogan" style="font-weight: 800;text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;">
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank">
Hire Odoo Developers</a>
</h3>
</a>
</div>
</div>
</div>
</section>
<section class="oe_container" style="padding: 1% 0% 0% 3%;">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;">
Our Industries
</h2>
<div style="display:flex;justify-content: space-between;flex-wrap:wrap;">
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-1.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank">
Trading
</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Easily procure and sell your products.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-2.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank">
Manufacturing</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Plan, track and schedule your operations.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-3.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank">
Restaurant</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Run your bar or restaurant methodical.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-4.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank">
POS</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Easy configuring and convivial selling.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-5.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 0px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank">
E-commerce & Website</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Mobile friendly, awe-inspiring product pages.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-6.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank">
Hotel Management</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
An all-inclusive hotel management application.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-7.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank">
Education</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
A Collaborative platform for educational management.
</h3>
</div>
</div>
<div style="flex-basis: 32%;padding-top: 20px;">
<div style="width:30%; float:left;">
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;">
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank">
<img src="https://www.cybrosys.com/images/odoo-index-industry-8.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/>
</a>
</div>
</div>
<div style="width:70%;float:left;">
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:800;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;">
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank">
Service Management</a>
</h3>
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;">
Keep track of services and invoice accordingly.
</h3>
</div>
</div>
</div>
</div>
</section>
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-footer-bg.png); background-repeat:no-repeat; background-size:100%;padding: 13% 0% 6% 0%;">
<div class="oe_slogan" style="margin-top:10px !important;margin-bottom: 0px;">
<div>
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="mailto:odoo@cybrosys.com"><i class="fa fa-envelope"></i> Email us </a>
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-phone"></i> Contact Us </a>
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 12px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-check-square"></i> Request Customization </a>
</div>
<br>
<img src="https://www.cybrosys.com/images/logo.png" style="width: 190px; margin-bottom: 25px;margin-top: 30px;" class="center-block">
<div>
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px; ;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td>
</div>
</div>
</section>

BIN
sale_discount_total/static/description/s_d_inv.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
sale_discount_total/static/description/s_d_settings.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
sale_discount_total/static/description/s_d_so.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
sale_discount_total/static/description/s_d_state.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

41
sale_discount_total/views/account_invoice_view.xml

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="discount_account_invoice_view_form" model="ir.ui.view">
<field name="name">discount.account.invoice</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='discount']" position="attributes">
<attribute name="digits">[16, 2]</attribute>
</xpath>
<xpath expr="//field[@name='amount_untaxed']" position="after">
<field name="amount_discount"/>
</xpath>
<xpath expr="//field[@name='narration']" position="after">
<div>
<label for="discount_type" string="Discount Type :"/>
<field name="discount_type" class="oe_inline"/>
</div>
<div>
<label for="discount_rate" string="Discount Rate :"/>
<field name="discount_rate" class="oe_inline"/>
</div>
</xpath>
</field>
</record>
<!-- <record id="discount_view_invoice_line_tree" model="ir.ui.view">-->
<!-- <field name="name">discount.account.invoice.line.tree</field>-->
<!-- <field name="model">account.move.line.tree.grouped.sales.purchase</field>-->
<!-- <field name="inherit_id" ref="account.view_move_line_tree_grouped_sales_purchases"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <xpath expr="//field[@name='debit']" position="attributes">-->
<!-- <attribute name="digits">[16, 2]</attribute>-->
<!-- </xpath>-->
<!-- </field>-->
<!-- </record>-->
</data>
</odoo>

20
sale_discount_total/views/invoice_report.xml

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="report_invoice_customized" inherit_id="account.report_invoice_document">
<xpath expr="//span[@t-field='line.discount']" position="replace">
<span t-esc="'%.2f'%(line.discount)"/>
</xpath>
<xpath expr="//tr[hasclass('border-black')]" position="after">
<tr>
<td>Discount</td>
<td class="text-right">
<span t-field="o.amount_discount"/>
</td>
</tr>
</xpath>
</template>
</data>
</odoo>

33
sale_discount_total/views/res_config_view.xml

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form_sale_discount" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.sale.discount</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="10"/>
<field name="inherit_id" ref="sale.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[@data-key='sale_management']/div[hasclass('o_settings_container')][2]/div[hasclass('o_setting_box')][2]" position="after">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="so_order_approval"/>
</div>
<div class="o_setting_right_pane">
<label for="so_order_approval"/>
<span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
<div class="text-muted">
Managers must approve discount
</div>
<div class="content-group" attrs="{'invisible': [('so_order_approval', '=', False)]}">
<div class="row mt16">
<label for="so_double_validation_limit" class="col-md-4 o_light_label"/>
<field name="so_double_validation_limit"/>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

21
sale_discount_total/views/sale_order_report.xml

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="report_saleorder_customized" inherit_id="sale.report_saleorder_document">
<xpath expr="//span[@t-field='line.discount']" position="replace">
<span t-esc="'%.2f'%(line.discount)"/>
</xpath>
<xpath expr="//tr[hasclass('border-black')]" position="after">
<tr>
<td>Total Discount</td>
<td class="text-right">
<span t-field="doc.amount_discount"
t-options='{"widget": "monetary", "display_currency": doc.pricelist_id.currency_id}'/>
</td>
</tr>
</xpath>
</template>
</data>
</odoo>

43
sale_discount_total/views/sale_view.xml

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="discount_sale_view_form" model="ir.ui.view">
<field name="name">discount.sale.order.form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='state']" position="before">
<button string="Approve" type="object" name="action_approve" states="waiting" class="oe_highlight"
groups="sales_team.group_sale_manager"/>
</xpath>
<xpath expr="//button[@name='action_cancel']" position="attributes">
<attribute name ="states">draft,sent,sale,waiting</attribute>
</xpath>
<!--<xpath expr="//tree/field[@name='discount']" position="replace">-->
<!--<field name="discount" class="oe_inline" digits="(16, 2)"/> %%-->
<!--</xpath>-->
<xpath expr="//group[@name='note_group']" position="replace">
<group col="4">
<group name="discount" colspan="2">
<field name="discount_type"/>
<field name="discount_rate"/>
</group>
<group class="oe_subtotal_footer oe_right" colspan="2" name="sale_total">
<field name="amount_untaxed" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<field name="amount_discount" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<field name="amount_tax" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<div class="oe_subtotal_footer_separator oe_inline">
<label for="amount_total" />
<button name="button_dummy"
states="draft,sent" string="(update)" type="object" class="oe_edit_only oe_link"/>
</div>
<field name="amount_total" nolabel="1" class="oe_subtotal_footer_separator" widget='monetary' options="{'currency_field': 'currency_id'}"/>
</group>
</group>
</xpath>
</field>
</record>
</data>
</odoo>

38
website_coupon/README.rst

@ -0,0 +1,38 @@
Website Coupon Code v12
=======================
Manage Website Coupon Codes for Products/Categories/All Products & Its Redeem Operations
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer:v11- Linto CT @ cybrosys, odoo@cybrosys.com
Version12:Meera K@cybrosys,Contact: odoo@cybrosys.com
Version 13: Vaishnavi B@cybrosys,Contact: odoo@cybrosys.com
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>`__

25
website_coupon/__init__.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: LINTO C T (odoo@cybrosys.com)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program.
# If not, see <https://www.gnu.org/licenses/>.
#
##############################################################################
from . import models
from . import controllers

44
website_coupon/__manifest__.py

@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: LINTO C T (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': 'Website Coupon Code',
'version': '13.0.1.0.0',
'summary': 'Manage Website Coupon Codes for Products/Categories/All Products & Its Redeem Operations',
'category': 'Website',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'depends': ['sale_management', 'website_sale'],
'website': 'https://www.cybrosys.com',
'data': [
'data/product_data.xml',
'views/gift_voucher.xml',
'views/applied_coupons.xml',
'views/templates.xml',
'security/ir.model.access.csv'
],
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

3
website_coupon/controllers/__init__.py

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import main

155
website_coupon/controllers/main.py

@ -0,0 +1,155 @@
# -*- coding: utf-8 -*-
from datetime import datetime
from odoo import fields, http, tools, _
from odoo.http import request
from odoo.addons.website_sale.controllers.main import WebsiteSale
class WebsiteCoupon(WebsiteSale):
@http.route(['/shop/cart'], type='http', auth="public", website=True)
def cart(self, access_token=None, revive='', **post):
order = request.website.sale_get_order()
if order and order.state != 'draft':
request.session['sale_order_id'] = None
order = request.website.sale_get_order()
values = {}
if order:
from_currency = order.company_id.currency_id
to_currency = order.pricelist_id.currency_id
compute_currency = lambda price: from_currency._convert(
price, to_currency, request.env.user.company_id, fields.Date.today())
else:
compute_currency = lambda price: price
values.update({
'website_sale_order': order,
'compute_currency': compute_currency,
'date': fields.Date.today(),
'suggested_products': [],
})
if order:
_order = order
if not request.env.context.get('pricelist'):
_order = order.with_context(pricelist=order.pricelist_id.id)
values['suggested_products'] = _order._cart_accessories()
if post.get('type') == 'popover':
return request.render("website_sale.cart_popover", values, headers={'Cache-Control': 'no-cache'})
if post.get('code_not_available'):
values['code_not_available'] = post.get('code_not_available')
elif post.get('coupon_not_available'):
values['coupon_not_available'] = post.get('coupon_not_available')
return request.render("website_sale.cart", values)
@http.route(['/shop/gift_coupon'], type='http', auth="public", website=True)
def gift_coupon(self, promo_voucher, **post):
"""This function will be executed when we click the apply button of the voucher code in the website.
It will verify the validity and availability of that coupon. If it can be applied, the coupon will be applied
and coupon balance will also be updated"""
curr_user = request.env.user
coupon = request.env['gift.coupon'].sudo().search([('code', '=', promo_voucher)], limit=1)
flag = True
if coupon and coupon.total_avail > 0:
applied_coupons = request.env['partner.coupon'].sudo().search([('coupon', '=', promo_voucher),
('partner_id', '=', curr_user.partner_id.id)], limit=1)
# checking voucher date and limit for each user for this coupon---------------------
if coupon.partner_id:
if curr_user.partner_id.id != coupon.partner_id.id:
flag = False
today = datetime.now().date()
if flag and applied_coupons.number < coupon.limit and today <= coupon.voucher.expiry_date:
# checking coupon validity ---------------------------
# checking date of coupon ------------
if coupon.start_date and coupon.end_date:
if today < coupon.start_date or today > coupon.end_date:
flag = False
elif coupon.start_date:
if today < coupon.start_date:
flag = False
elif coupon.end_date:
if today > coupon.end_date:
flag = False
else:
flag = False
else:
flag = False
if flag:
voucher_type = coupon.voucher.voucher_type
voucher_val = coupon.voucher_val
type = coupon.type
coupon_product = request.env['product.product'].sudo().search([('name', '=', 'Gift Coupon')], limit=1)
if coupon_product:
order = request.website.sale_get_order(force_create=1)
flag_product = False
for line in order.order_line:
if line.product_id.name == 'Gift Coupon':
flag = False
break
if flag and order.order_line:
if voucher_type == 'product':
# the voucher type is product ----------------------------
categ_id = coupon.voucher.product_id
for line in order.order_line:
if line.product_id.name == categ_id.name:
flag_product = True
elif voucher_type == 'category':
# the voucher type is category ----------------------------
product_id = coupon.voucher.product_categ
for line in order.order_line:
if line.product_id.categ_id.name == product_id.name:
flag_product = True
elif voucher_type == 'all':
# the voucher is applicable to all products ----------------------------
flag_product = True
if flag_product:
# the voucher is applicable --------------------------------------
if type == 'fixed':
# coupon type is 'fixed'--------------------------------------
if voucher_val < order.amount_total:
coupon_product.product_tmpl_id.write({'list_price': -voucher_val})
else:
return request.redirect("/shop/cart?coupon_not_available=3")
elif type == 'percentage':
# coupon type is percentage -------------------------------------
amount_final = 0
if voucher_type == 'product':
for line in order.order_line:
if line.product_id.name == categ_id.name:
amount_final = (voucher_val / 100) * line.price_total
break
elif voucher_type == 'category':
for line in order.order_line:
if line.product_id.categ_id.name == product_id.name:
amount_final += (voucher_val / 100) * line.price_total
elif voucher_type == 'all':
amount_final = (voucher_val/100) * order.amount_total
coupon_product.product_tmpl_id.write({'list_price': -amount_final})
order._cart_update(product_id=coupon_product.id, set_qty=1, add_qty=1)
# updating coupon balance--------------
total = coupon.total_avail - 1
coupon.write({'total_avail': total})
# creating a record for this partner, i.e he is used this coupon once-----------
if not applied_coupons:
curr_user.partner_id.write({'applied_coupon': [(0, 0, {'partner_id': curr_user.partner_id.id,
'coupon': coupon.code,
'number': 1})]})
else:
applied_coupons.write({'number': applied_coupons.number + 1})
else:
return request.redirect("/shop/cart?coupon_not_available=1")
else:
return request.redirect("/shop/cart?coupon_not_available=2")
else:
return request.redirect("/shop/cart?coupon_not_available=1")
return request.redirect("/shop/cart")

6
website_coupon/data/product_data.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record model="product.product" id="discount_product">
<field name="name">Gift Coupon</field>
</record>
</odoo>

6
website_coupon/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <website_coupon>
#### 28.10.2019
#### Version 13.0.1.0.0
Initial Commit for Website Coupon.

315
website_coupon/i18n/fr.po

@ -0,0 +1,315 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_coupon
#
# Xavier Brochard <xavier@alternatif.org>, 2017.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0-20171109\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-17 11:24+0000\n"
"PO-Revision-Date: 2017-11-17 15:04+0100\n"
"Last-Translator: Xavier Brochard <xavier@alternatif.org>\n"
"Language-Team: French <>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
"Language: fr\n"
"X-Generator: Lokalize 2.0\n"
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.cart_lines_extended
msgid "<small><i class=\"fa fa-trash-o\"/> Remove</small>"
msgstr "<small><i class=\"fa fa-trash-o\"/> Enlever</small>"
#. module: website_coupon
#: selection:gift.voucher,voucher_type:0
msgid "All Products"
msgstr "Tous les articles"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_voucher_type
msgid "Applicable on "
msgstr "Valable sur"
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.applied_coupons_view
msgid "Applied Coupons"
msgstr ""
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.voucher_code
msgid "Apply"
msgstr "Valider"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_code
msgid "Code"
msgstr ""
#. module: website_coupon
#: sql_constraint:gift.coupon:0
msgid "Code already exists !"
msgstr "Ce code existe déjà!"
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.gift_coupon_form
msgid "Conditions"
msgstr "Restrictions obligatoires"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_coupon
msgid "Coupon Applied"
msgstr "Code utilisé"
#. module: website_coupon
#: model:ir.ui.menu,name:website_coupon.gift_coupon_history
msgid "Coupon History"
msgstr "Utilisation"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_res_partner_applied_coupon
#: model:ir.model.fields,field_description:website_coupon.field_res_users_applied_coupon
msgid "Coupons Applied"
msgstr ""
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_create_uid
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_create_uid
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_create_uid
msgid "Created by"
msgstr ""
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_create_date
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_create_date
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_create_date
msgid "Created on"
msgstr ""
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_display_name
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_display_name
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_end_date
msgid "End Date"
msgstr "Finit le"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_expiry_date
msgid "Expiry Date"
msgstr "Expire le"
#. module: website_coupon
#: selection:gift.coupon,type:0
msgid "Fixed Amount"
msgstr "Montant fixe"
#. module: website_coupon
#: model:ir.actions.act_window,name:website_coupon.action_gift_coupon
msgid "Generate Gift Coupons"
msgstr "Créer des codes promotionnels"
#. module: website_coupon
#: model:ir.ui.menu,name:website_coupon.gift_coupon
#: model:product.product,name:website_coupon.discount_product
#: model:product.template,name:website_coupon.discount_product_product_template
msgid "Gift Coupon"
msgstr "Code promotionel"
#. module: website_coupon
#: model:ir.ui.menu,name:website_coupon.gift_coupon_main
msgid "Gift Coupons"
msgstr "Codes promo"
#. module: website_coupon
#: model:ir.actions.act_window,name:website_coupon.action_gift_coupon_history
msgid "Gift Coupons History"
msgstr "Promotions utilisées"
#. module: website_coupon
#: model:ir.ui.menu,name:website_coupon.gift_voucher
msgid "Gift Voucher"
msgstr "Promotions autorisées"
#. module: website_coupon
#: model:ir.actions.act_window,name:website_coupon.action_gift_voucher
msgid "Gift Vouchers"
msgstr "Promotions autorisées"
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.voucher_code
msgid "Have a voucher code? Fill this field and apply."
msgstr "Vous avez un code de réduction ? Remplissez ce champ et validez."
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_id
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_id
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_id
msgid "ID"
msgstr ""
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon___last_update
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher___last_update
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon___last_update
msgid "Last Modified on"
msgstr ""
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_write_uid
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_write_uid
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_write_uid
msgid "Last Updated by"
msgstr ""
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_write_date
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_write_date
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_write_date
msgid "Last Updated on"
msgstr ""
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_partner_id
msgid "Limit to a Single Partner"
msgstr "Limiter au contact"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_max_value
msgid "Maximum Voucher Value"
msgstr "Valeur de calcul maximum"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_min_value
msgid "Minimum Voucher Value"
msgstr "Valeur de calcul minimum"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_name
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_name
#: model:ir.ui.view,arch_db:website_coupon.gift_coupon_form
msgid "Name"
msgstr "Nom"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_number
msgid "Number of Times Used"
msgstr "Nombre de fois"
#. module: website_coupon
#: model:ir.model,name:website_coupon.model_res_partner
#: model:ir.model.fields,field_description:website_coupon.field_partner_coupon_partner_id
msgid "Partner"
msgstr "Contact"
#. module: website_coupon
#: selection:gift.coupon,type:0
msgid "Percentage"
msgstr "Pourcentage"
#. module: website_coupon
#: code:addons/website_coupon/models/gift_voucher.py:77
#, python-format
msgid "Please check the voucher value"
msgstr ""
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.cart_lines_extended
msgid "Price"
msgstr "Prix"
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.gift_coupon_form
msgid "Pricing"
msgstr "Montant"
#. module: website_coupon
#: selection:gift.voucher,voucher_type:0
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_product_id
#: model:ir.ui.view,arch_db:website_coupon.cart_lines_extended
msgid "Product"
msgstr "Article"
#. module: website_coupon
#: selection:gift.voucher,voucher_type:0
#: model:ir.model.fields,field_description:website_coupon.field_gift_voucher_product_categ
msgid "Product Category"
msgstr "Catégorie d'articles"
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.cart_lines_extended
msgid "Quantity"
msgstr "Quantité"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_start_date
msgid "Start Date"
msgstr "Débute le"
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.voucher_code
msgid "The discount amount is too large"
msgstr ""
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.voucher_code
msgid "This gift code is not available"
msgstr "Ce code n'est pas valable"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_total_avail
msgid "Total Available"
msgstr "Quantité totale disponible"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_limit
msgid "Total Available For Each User"
msgstr "Quantité maxi par personne"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_type
msgid "Type"
msgstr ""
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_voucher
msgid "Voucher"
msgstr "Autorisation"
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.voucher_code
msgid "Voucher Code"
msgstr "Code promo"
#. module: website_coupon
#: model:ir.model.fields,field_description:website_coupon.field_gift_coupon_voucher_val
msgid "Voucher Value"
msgstr "Valeur de calcul"
#. module: website_coupon
#: model:ir.ui.view,arch_db:website_coupon.voucher_code
msgid "code..."
msgstr ""
#. module: website_coupon
#: model:ir.model,name:website_coupon.model_gift_coupon
msgid "gift.coupon"
msgstr ""
#. module: website_coupon
#: model:ir.model,name:website_coupon.model_gift_voucher
msgid "gift.voucher"
msgstr ""
#. module: website_coupon
#: model:ir.model,name:website_coupon.model_partner_coupon
msgid "partner.coupon"
msgstr ""

22
website_coupon/models/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: LINTO C T (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 gift_voucher

88
website_coupon/models/gift_voucher.py

@ -0,0 +1,88 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2018-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: LINTO C T(<https://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program.
# If not, see <https://www.gnu.org/licenses/>.
#
##############################################################################
import string
import random
from odoo import models, fields, api, _
from datetime import datetime,date
from odoo.exceptions import UserError
class GiftVoucher(models.Model):
_name = 'gift.voucher'
name = fields.Char(string="Name", required=True)
voucher_type = fields.Selection(
selection=[
('product', 'Product'),
('category', 'Product Category'),
('all', 'All Products'),
], string="Applicable on ", default='product'
)
product_id = fields.Many2one('product.product', string="Product")
product_categ = fields.Many2one('product.category', string="Product Category")
min_value = fields.Integer(string="Minimum Voucher Value", required=True)
max_value = fields.Integer(string="Maximum Voucher Value", required=True)
expiry_date = fields.Date(string="Expiry Date", required=True)
class GiftCoupon(models.Model):
_name = 'gift.coupon'
def get_code(self):
size = 7
chars = string.ascii_uppercase + string.digits
return ''.join(random.choice(chars) for _ in range(size))
_sql_constraints = [
('name_uniq', 'unique (code)', "Code already exists !"),
]
name = fields.Char(string="Name", required=True)
code = fields.Char(string="Code", default=get_code)
voucher = fields.Many2one('gift.voucher', string="Voucher", required=True)
start_date = fields.Date(string="Start Date")
end_date = fields.Date(string="End Date")
partner_id = fields.Many2one('res.partner', string="Limit to a Single Partner")
limit = fields.Integer(string="Total Available For Each User", default=1)
total_avail = fields.Integer(string="Total Available", default=1)
voucher_val = fields.Float(string="Voucher Value")
type = fields.Selection([
('fixed', 'Fixed Amount'),
('percentage', 'Percentage'),
], store=True, default='fixed')
@api.onchange('voucher_val')
def check_val(self):
if self.voucher_val > self.voucher.max_value or self.voucher_val < self.voucher.min_value:
raise UserError(_("Please check the voucher value"))
class CouponPartner(models.Model):
_name = 'partner.coupon'
partner_id = fields.Many2one('res.partner', string="Partner")
coupon = fields.Char(string="Coupon Applied")
number = fields.Integer(string="Number of Times Used")
class PartnerExtended(models.Model):
_inherit = 'res.partner'
applied_coupon = fields.One2many('partner.coupon', 'partner_id', string="Coupons Applied")

10
website_coupon/security/ir.model.access.csv

@ -0,0 +1,10 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_website_coupon_voucher,website_coupon_gift_voucher,model_gift_voucher,sales_team.group_sale_manager,1,1,1,1
access_website_coupon_coupon,website_coupon_gift_coupon,model_gift_coupon,sales_team.group_sale_manager,1,1,1,1
access_website_coupon_partner,website_coupon_partner_coupon,model_partner_coupon,sales_team.group_sale_manager,1,1,1,1
access_website_voucher_user1,website_coupon_voucher_usr1,model_gift_voucher,sales_team.group_sale_salesman_all_leads,1,0,0,0
access_website_coupon_usr1,website_gift_coupon_usr1,model_gift_coupon,sales_team.group_sale_salesman_all_leads,1,0,0,0
access_website_coupon_partner_usr1,website_coupon_partner_usr1,model_partner_coupon,sales_team.group_sale_salesman_all_leads,1,0,0,0
access_website_voucher_user2,website_coupon_voucher_usr2,model_gift_voucher,sales_team.group_sale_salesman,1,0,0,0
access_website_coupon_usr2,website_gift_coupon_usr2,model_gift_coupon,sales_team.group_sale_salesman,1,0,0,0
access_website_coupon_partner_usr2,website_coupon_partner_usr2,model_partner_coupon,sales_team.group_sale_salesman,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_website_coupon_voucher website_coupon_gift_voucher model_gift_voucher sales_team.group_sale_manager 1 1 1 1
3 access_website_coupon_coupon website_coupon_gift_coupon model_gift_coupon sales_team.group_sale_manager 1 1 1 1
4 access_website_coupon_partner website_coupon_partner_coupon model_partner_coupon sales_team.group_sale_manager 1 1 1 1
5 access_website_voucher_user1 website_coupon_voucher_usr1 model_gift_voucher sales_team.group_sale_salesman_all_leads 1 0 0 0
6 access_website_coupon_usr1 website_gift_coupon_usr1 model_gift_coupon sales_team.group_sale_salesman_all_leads 1 0 0 0
7 access_website_coupon_partner_usr1 website_coupon_partner_usr1 model_partner_coupon sales_team.group_sale_salesman_all_leads 1 0 0 0
8 access_website_voucher_user2 website_coupon_voucher_usr2 model_gift_voucher sales_team.group_sale_salesman 1 0 0 0
9 access_website_coupon_usr2 website_gift_coupon_usr2 model_gift_coupon sales_team.group_sale_salesman 1 0 0 0
10 access_website_coupon_partner_usr2 website_coupon_partner_usr2 model_partner_coupon sales_team.group_sale_salesman 1 0 0 0

BIN
website_coupon/static/description/apply_coupon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
website_coupon/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

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

Loading…
Cancel
Save