Browse Source

Merge 1bb34451ac into 57e4f8ea9f

pull/4/merge
CybroOdoo 9 years ago
parent
commit
37d4e656ad
  1. 3
      library_management/__openerp__.py
  2. 1
      med_marketing/__init__.py
  3. 25
      med_marketing/__openerp__.py
  4. 138
      med_marketing/demo/demo.xml
  5. 1
      med_marketing/models/__init__.py
  6. 33
      med_marketing/models/doctor.py
  7. 72
      med_marketing/models/doctor_exp.py
  8. 14
      med_marketing/models/med_marketing.py
  9. 18
      med_marketing/models/rep.py
  10. BIN
      med_marketing/static/description/icon.png
  11. BIN
      med_marketing/static/img/dr1.jpg
  12. BIN
      med_marketing/static/img/dr2.jpg
  13. BIN
      med_marketing/static/img/dr3.jpg
  14. BIN
      med_marketing/static/img/dr4.jpg
  15. BIN
      med_marketing/static/img/dr6.jpg
  16. BIN
      med_marketing/static/img/dr7.jpg
  17. 81
      med_marketing/views/doctor_exp_view.xml
  18. 81
      med_marketing/views/doctor_view.xml
  19. 217
      med_marketing/views/med_marketing_view.xml
  20. 65
      med_marketing/views/rep_view.xml
  21. 1
      medical_feature/__init__.py
  22. 28
      medical_feature/__openerp__.py
  23. 335
      medical_feature/demo/demo.xml
  24. 1
      medical_feature/expiry_manage/__init__.py
  25. 52
      medical_feature/expiry_manage/expiry_manage.py
  26. 56
      medical_feature/expiry_manage/expiry_manage_view.xml
  27. 170
      medical_feature/new_names.xml
  28. 32
      medical_feature/pharmacy_mgt.py
  29. 1
      medical_feature/route_manage/__init__.py
  30. 30
      medical_feature/route_manage/report.xml
  31. 237
      medical_feature/route_manage/route_manage_view.xml
  32. 89
      medical_feature/route_manage/route_mgt.py
  33. BIN
      medical_feature/static/description/icon.png
  34. BIN
      medical_feature/static/img/Acetylcysteine.jpg
  35. BIN
      medical_feature/static/img/Azithromycin.jpg
  36. BIN
      medical_feature/static/img/Carbomer_liquid_eye_gels.jpg
  37. BIN
      medical_feature/static/img/allr_Celiprolol.jpg
  38. BIN
      medical_feature/static/img/allr_Cetirizine.jpg
  39. BIN
      medical_feature/static/img/allr_Dimethindene.jpg
  40. BIN
      medical_feature/static/img/er_amoxicillin-1.jpg
  41. BIN
      medical_feature/static/img/gs_Aciphex.jpg
  42. BIN
      medical_feature/static/img/gs_Gleevec.jpg
  43. BIN
      medical_feature/static/img/gs_gastrogafin.jpg
  44. BIN
      medical_feature/static/img/re_clarithromycin.jpg
  45. 28
      medical_feature/views/medicines_view.xml
  46. 174
      medical_feature/views/pharmacy_mgt_view.xml
  47. 1
      pos_product_category_filter/__init__.py
  48. 27
      pos_product_category_filter/__openerp__.py
  49. 27
      pos_product_category_filter/__openerp__.py~
  50. 1
      pos_product_category_filter/models/__init__.py
  51. 16
      pos_product_category_filter/models/custom.py
  52. 32
      pos_product_category_filter/static/description/index.html
  53. 48
      pos_product_category_filter/static/description/index.html~
  54. BIN
      pos_product_category_filter/static/description/pos.png
  55. 214
      pos_product_category_filter/static/src/js/category.js
  56. 18
      pos_product_category_filter/views/custom_view.xml
  57. 12
      pos_product_category_filter/views/template.xml
  58. 3
      sale_discount_total/__init__.py
  59. 8
      sale_discount_total/__openerp__.py
  60. 6
      sale_discount_total/__openerp__.py~
  61. 1
      sale_discount_total/models/__init__.py
  62. 2
      sale_discount_total/models/__init__.py~
  63. 94
      sale_discount_total/models/account_invoice.py
  64. 64
      sale_discount_total/models/sale.py
  65. 102
      sale_discount_total/models/sale_discount_approval.py
  66. 2
      sale_discount_total/report/__init__.py
  67. 22
      sale_discount_total/report/invoice_report.py
  68. 14
      sale_discount_total/report/sale_report.py
  69. BIN
      sale_discount_total/static/description/Disc_appr_conf.png
  70. BIN
      sale_discount_total/static/description/Disc_appr_wrkfl.png
  71. BIN
      sale_discount_total/static/description/Discount_inv_amnt.png
  72. BIN
      sale_discount_total/static/description/Discount_so_perc.png
  73. 39
      sale_discount_total/static/description/index.html
  74. 35
      sale_discount_total/views/account_invoice_view.xml
  75. 69
      sale_discount_total/views/invoice_report.xml
  76. 87
      sale_discount_total/views/invoice_report.xml~
  77. 28
      sale_discount_total/views/sale_discount_approval_view.xml
  78. 133
      sale_discount_total/views/sale_discount_approval_workflow.xml
  79. 48
      sale_discount_total/views/sale_order_report.xml
  80. 40
      sale_discount_total/views/sale_order_report.xml~
  81. 4
      sale_discount_total/views/sale_view.xml
  82. 1
      salon_operation/__init__.py
  83. 41
      salon_operation/__openerp__.py
  84. 28
      salon_operation/demo/demo_chair.xml
  85. 911
      salon_operation/demo/demo_day.xml
  86. 166
      salon_operation/demo/demo_month.xml
  87. 473
      salon_operation/demo/demo_time.xml
  88. 1
      salon_operation/models/__init__.py
  89. 55
      salon_operation/models/autofill_month.py
  90. 14
      salon_operation/models/chair.py
  91. 78
      salon_operation/models/confirm_booking.py
  92. 88
      salon_operation/models/day.py
  93. 112
      salon_operation/models/month.py
  94. 83
      salon_operation/models/period.py
  95. 161
      salon_operation/models/salon_book.py
  96. 6
      salon_operation/security/ir.model.access.csv
  97. BIN
      salon_operation/static/description/Times.png
  98. BIN
      salon_operation/static/description/auto_fill.png
  99. BIN
      salon_operation/static/description/booked.png
  100. BIN
      salon_operation/static/description/chair_under_conf.png

3
library_management/__openerp__.py

@ -1,7 +1,8 @@
{
'name': 'Public Library Management ',
'version': '1.0',
'author' : 'Cybrosys',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'category': 'Tools',
'summary': 'book management',
'description': """

1
med_marketing/__init__.py

@ -0,0 +1 @@
import models

25
med_marketing/__openerp__.py

@ -0,0 +1,25 @@
{
'name': "Pharmacy Marketing",
'summary': """Sales Representative, Doctors, Targets,..etc for Medicine filed """,
'description': """
""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'category': 'Medicine',
'version': '0.1',
'depends': ["base",
'medical_feature',
"sale", "marketing",
"marketing_campaign",
"hr", "account",
"hr_payroll"],
'data': ['views/med_marketing_view.xml',
'views/rep_view.xml',
'views/doctor_view.xml',
'views/doctor_exp_view.xml', ],
'demo': ['demo/demo.xml'],
'installable': True,
'auto_install': False,
'application': True,
}

138
med_marketing/demo/demo.xml

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--DEMO DATA [DEPARTMENTS]-->
<record id="departments1" model="pha_marketing.departments">
<field name="name">Neurology</field>
</record>
<record id="departments2" model="pha_marketing.departments">
<field name="name">Cardiology</field>
</record>
<record id="departments3" model="pha_marketing.departments">
<field name="name">Dentistry</field>
</record>
<record id="departments4" model="pha_marketing.departments">
<field name="name">ENT</field>
</record>
<record id="departments5" model="pha_marketing.departments">
<field name="name">Gynaecology</field>
</record>
<record id="departments6" model="pha_marketing.departments">
<field name="name">Pediatrics</field>
</record>
<!--DEMO REPS-->
<record id="rep1" model="hr.employee">
<field name="name">Liam Gomer</field>
<field name="rep">1</field>
<field name="target">150000</field>
</record>
<record id="rep2" model="hr.employee">
<field name="name">Roger Scott</field>
<field name="rep">1</field>
<field name="target">450000</field>
<field name="image" type="base64" file="hr/static/img/employee_fp-image.jpg"/>
</record>
<record id="rep3" model="hr.employee">
<field name="name">David</field>
<field name="rep">1</field>
<field name="target">850000</field>
<field name="image" type="base64" file="hr/static/img/employee_al-image.jpg"/>
</record>
<record id="rep4" model="hr.employee">
<field name="name">Macklin</field>
<field name="rep">1</field>
<field name="target">780000</field>
<field name="image" type="base64" file="hr/static/img/employee_niv-image.jpg"/>
</record>
<record id="rep5" model="hr.employee">
<field name="name">Jack</field>
<field name="rep">1</field>
<field name="target">750000</field>
<field name="image" type="base64" file="hr/static/img/employee_mit-image.png"/>
</record>
<record id="rep6" model="hr.employee">
<field name="name">Joe</field>
<field name="rep">1</field>
<field name="target">960000</field>
<field name="image" type="base64" file="hr/static/img/employee_chs-image.jpg"/>
</record>
<!--DEMO DOCTORS-->
<record id="dr1" model="res.partner">
<field name="name">Dr. Arden</field>
<field name="doctor">1</field>
<field name="customer">1</field>
<field name="specialist_in" ref="departments2"/>
<field name="related_rep" ref="rep1"/>
<field name="target">15000</field>
<field name="email">arden@gmail.com</field>
<field name="mobile">2653241536</field>
<field name="image" type="base64" file="med_marketing/static/img/dr1.jpg"/>
</record>
<record id="dr2" model="res.partner">
<field name="name">Dr.Armstrong</field>
<field name="doctor">1</field>
<field name="customer">0</field>
<field name="specialist_in" ref="departments3"/>
<field name="related_rep" ref="rep2"/>
<field name="target">26000</field>
<field name="email">armstrong@gmail.com</field>
<field name="mobile">2653651436</field>
<field name="image" type="base64" file="med_marketing/static/img/dr2.jpg"/>
</record>
<record id="dr3" model="res.partner">
<field name="name">Dr.Saunder</field>
<field name="doctor">1</field>
<field name="customer">0</field>
<field name="specialist_in" ref="departments4"/>
<field name="related_rep" ref="rep3"/>
<field name="target">78000</field>
<field name="email">saunder@yahoo.com</field>
<field name="mobile">2653365436</field>
<field name="image" type="base64" file="med_marketing/static/img/dr3.jpg"/>
</record>
<record id="dr4" model="res.partner">
<field name="name">Dr.Asbjorn</field>
<field name="doctor">1</field>
<field name="customer">0</field>
<field name="specialist_in" ref="departments5"/>
<field name="related_rep" ref="rep4"/>
<field name="target">75000</field>
<field name="email">asbjorn@yahoo.com</field>
<field name="mobile">2657415436</field>
<field name="image" type="base64" file="med_marketing/static/img/dr4.jpg"/>
</record>
<record id="dr5" model="res.partner">
<field name="name">Dr.Salomon</field>
<field name="doctor">1</field>
<field name="customer">0</field>
<field name="specialist_in" ref="departments6"/>
<field name="related_rep" ref="rep5"/>
<field name="target">85000</field>
<field name="email">salomon@yahoo.com</field>
<field name="mobile">4877415436</field>
<field name="image" type="base64" file="med_marketing/static/img/dr6.jpg"/>
</record>
<record id="dr6" model="res.partner">
<field name="name">Dr.Saunderson</field>
<field name="doctor">1</field>
<field name="customer">0</field>
<field name="specialist_in" ref="departments1"/>
<field name="related_rep" ref="rep6"/>
<field name="target">65000</field>
<field name="email">saunderson@gmail.com</field>
<field name="mobile">6987415436</field>
<field name="image" type="base64" file="med_marketing/static/img/dr7.jpg"/>
</record>
</data>
</openerp>

1
med_marketing/models/__init__.py

@ -0,0 +1 @@
import doctor,med_marketing,rep,doctor_exp

33
med_marketing/models/doctor.py

@ -0,0 +1,33 @@
from openerp import models, fields, api
import datetime
from dateutil import parser
class Doctors(models.Model):
_inherit = 'res.partner'
doctor = fields.Boolean('Doctor')
specialist_in = fields.Many2one('pha_marketing.departments', 'Specialist in')
related_rep = fields.Many2one('hr.employee', string='Related Rep.', domain="[('rep','=',True)]")
target = fields.Integer('Target')
@api.one
def _get_total_sale(self):
total = 0.0
created_domain = [('type', 'in', ['out_invoice', 'out_refund']), ('state', 'not in', ['draft', 'cancel']), ]
for EACH_REPORT in self.env['account.invoice.report'].search(created_domain):
if self.zip == EACH_REPORT.partner_id.zip:
if self.specialist_in.id in EACH_REPORT.product_id.uses_in.ids:
if parser.parse(EACH_REPORT.date).month == datetime.date.today().month:
total_doctor = 0
for EACH_Doctor in self.search([('doctor', '=', True)]):
if EACH_Doctor.zip == self.zip and EACH_Doctor.specialist_in.id in EACH_REPORT.product_id.uses_in.ids:
total_doctor += 1
if total_doctor != 0:
total += (EACH_REPORT.price_total/total_doctor)
self.total_sale = total
total_sale = fields.Integer('Total sale', compute='_get_total_sale', help='Will calculate the doctors by considering zip code of both Doctors and Retailers and compare the department of doctor with use of sold medicines.')

72
med_marketing/models/doctor_exp.py

@ -0,0 +1,72 @@
from openerp import models, fields,api
import datetime
class DoctorBenefit(models.Model):
_name = 'med_marketing.doctor.line'
name = fields.Char('Description')
doctor_id = fields.Many2one('res.partner')
account_id = fields.Many2one('account.account', 'Account')
amt = fields.Float('Cost')
exp_account = fields.Many2one('account.account', 'Expenses Account')
state = fields.Selection([('unposted', 'Draft'), ('posted', 'Posted'), ], default="unposted")
journal_id = fields.Many2one('account.journal', 'Journal')
@api.one
def post_confirm(self):
self.state = 'posted'
ref = 'DRX' + str(datetime.datetime.now().year) + str(self.id).zfill(4)
num = 'DRX' + '/' + str(datetime.datetime.now().year) + '/' + str(self.id).zfill(4)
if self.name == False:
description = ''
else:
description = self.name
j_lines_list = []
j_lines_1 = {'name': description,
'partner_id': None,
'account_id': self.account_id.id,
'debit': 0.0,
'credit': self.amt,
}
j_lines_list.append((0, 0, j_lines_1))
j_lines_2 = {'name': description,
'partner_id': None,
'account_id': self.exp_account.id,
'debit': self.amt,
'credit': 0.0,
}
j_lines_list.append((0, 0, j_lines_2))
j_values = {'name': num,
'journal_id': self.journal_id.id,
'ref': ref,
'state': 'posted'
}
j_values.update({'line_id': j_lines_list})
j_obj = self.pool.get('account.move')
j_obj.create(self._cr, self._uid, j_values)
class Doctors(models.Model):
_inherit = 'res.partner'
@api.one
def get_current_id(self):
return self.id
def doctor_exp_btn(self, cr, uid, ids, context=None):
created_domain = '[("doctor_id","in",'+str(self.get_current_id(cr, uid, ids, context))+')]'
return {
'name':'Doctor Expenses',
'type': 'ir.actions.act_window',
'res_model': 'med_marketing.doctor.line',
'view_type': 'form',
'view_mode': 'tree,form',
'target': 'current',
'domain': created_domain,
}

14
med_marketing/models/med_marketing.py

@ -0,0 +1,14 @@
from openerp import models, fields,api
class MedicalDepartments(models.Model):
_name = 'pha_marketing.departments'
name = fields.Char('Name of Department')
class MedicinesInfo(models.Model):
_inherit = "product.template"
uses_in = fields.Many2many('pha_marketing.departments', 'name')

18
med_marketing/models/rep.py

@ -0,0 +1,18 @@
from openerp import models, fields,api
class RepEmployee(models.Model):
_inherit = 'hr.employee'
rep = fields.Boolean('Medical Representative')
commission = fields.Float('Commission')
target = fields.Integer('Target')
@api.one
def _get_total_sale(self):
total = 0.0
for EACH_Doctor in self.env['res.partner'].search([('doctor', '=', True)]):
if EACH_Doctor.related_rep.id == self.id:
total += EACH_Doctor.total_sale
self.total_sale = total
total_sale = fields.Integer('Total sale', compute='_get_total_sale')

BIN
med_marketing/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
med_marketing/static/img/dr1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
med_marketing/static/img/dr2.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
med_marketing/static/img/dr3.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

BIN
med_marketing/static/img/dr4.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
med_marketing/static/img/dr6.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
med_marketing/static/img/dr7.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

81
med_marketing/views/doctor_exp_view.xml

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--FORM [DOCTOR EXPENSES]-->
<record id="form_doctor_exp" model="ir.ui.view">
<field name="name">med_marketing.doctor.line.form</field>
<field name="model">med_marketing.doctor.line</field>
<field name="arch" type="xml">
<form>
<header>
<button string="Post" states="unposted" name="post_confirm" type="object" class="oe_highlight"/>
<field name="state" widget="statusbar" statusbar_visible="unposted,posted"/>
</header>
<sheet>
<group>
<group>
<field name="name" attrs="{'readonly':[('state', 'in', ('posted'))]}"/>
<field name="doctor_id"
domain="[('doctor', '=', True)]"
context="{'search_default_doctor':1, 'default_doctor':1, 'default_supplier':0, 'default_customer':0}"
attrs="{'readonly':[('state', 'in', ('posted'))]}"/>
<field name="amt"
attrs="{'readonly':[('state', 'in', ('posted'))]}"/>
</group>
<group>
<field name="journal_id" required="1" attrs="{'readonly':[('state', 'in', ('posted'))]}"/>
<field name="account_id"
domain="[('type', 'in', ['liquidity', 'payable'])]"
required="1"
attrs="{'readonly':[('state', 'in', ('posted'))]}"/>
<field name="exp_account"
domain="[('user_type.report_type','=','expense'), ('type','!=','view')]"
required="1"
attrs="{'readonly':[('state', 'in', ('posted'))]}"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<!--TREE [DOCTOR EXPENSES]-->
<record id="tree_doctor_exp" model="ir.ui.view">
<field name="name">med_marketing.doctor.line.tree</field>
<field name="model">med_marketing.doctor.line</field>
<field name="arch" type="xml">
<tree colors="blue:state=='unposted'">
<field name="name"/>
<field name="doctor_id"/>
<field name="account_id"/>
<field name="amt"/>
<field name="exp_account"/>
<field name="state"/>
</tree>
</field>
</record>
<!--ACTION [DOCTOR EXPENSES]-->
<record id="action_doctor_exp" model="ir.actions.act_window">
<field name="name">Doctor Benefits</field>
<field name="res_model">med_marketing.doctor.line</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a new doctor benefits.
</p>
</field>
</record>
<!--MENU [DOCTOR EXPENSES]-->
<menuitem action="action_doctor_exp"
id="menu_doctor_exp"
sequence="3"
parent="med_marketing.menu_marketing"/>
</data>
</openerp>

81
med_marketing/views/doctor_view.xml

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--SEARCH [DOCTORS]-->
<record id="search_res_partner_doctor" model="ir.ui.view">
<field name="name">res.partner.doctor</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_res_partner_filter"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='supplier']" position="after">
<filter string="Doctors"
name="doctor"
domain="[('doctor','=',1)]"
help="Doctor Partners"/>
</xpath>
</field>
</record>
<!--FORM [DOCTOR]-->
<record id="form_res_partner_doctor" model="ir.ui.view">
<field name="name">res.partner.doctor</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='sales_purchases']/group[1]/group[2]" position="inside">
<field name="doctor"/>
</xpath>
<xpath expr="//field[@name='parent_id']" position="before">
<label for="specialist_in" string="Specialist in" attrs="{'invisible': [('doctor', '=', False)]}"/>
<field name="specialist_in"
attrs="{'invisible': [('doctor', '=', False)]}"/>
<label for="related_rep" string="Related Medical Representative" attrs="{'invisible': [('doctor', '=', False)]}"/>
<field name="related_rep"
context="{'default_rep':1}"
attrs="{'invisible': [('doctor', '=', False)]}"/>
</xpath>
<xpath expr="//group[1]/group[1]" position="inside">
<field name="target"
attrs="{'invisible': [('doctor', '=', False)]}"/>
<field name="total_sale"
attrs="{'invisible': [('doctor', '=', False)]}"/>
</xpath>
<xpath expr="//div[@name='buttons']" position="inside">
<button string="Benefits"
name="doctor_exp_btn"
class="oe_stat_button"
icon="fa fa-gift"
type="object"
attrs="{'invisible': [('doctor', '=', False)]}"/>
</xpath>
</field>
</record>
<!--ACTION [DOCTORS]-->
<record id="action_partner_doctor" model="ir.actions.act_window">
<field name="name">Doctors</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="context">{"search_default_doctor":1, "default_doctor":1, "default_supplier":0, "default_customer":0}</field>
<field name="search_view_id" ref="base.view_res_partner_filter"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a contact in your address book.
</p><p>
Odoo helps you easily track all activities related to
a doctor.
</p>
</field>
</record>
<!--MENU [DOCTORS]-->
<menuitem action="action_partner_doctor"
id="menu_partner_doctor"
sequence="3"
parent="med_marketing.menu_marketing"/>
</data>
</openerp>

217
med_marketing/views/med_marketing_view.xml

@ -0,0 +1,217 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--MENU [MARKETING]-->
<menuitem name="Marketing"
id="menu_marketing"
sequence="40"
parent="medical_feature.menu_med_features"
groups="medical_feature.group_medical_user" />
<!--DEPARTMENT IN PRODUCT-->
<record model="ir.ui.view" id="product_template_view_inherited">
<field name="name">product.template.form.inherited</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='type']" position="before">
<field string="Uses in" name="uses_in" widget="many2many_tags"/>
</xpath>
</field>
</record>
<!--TREE VIEW [DEPARTMENTS]-->
<record model="ir.ui.view" id="view_departments_tree">
<field name="name">pha_marketing.departments.tree</field>
<field name="model">pha_marketing.departments</field>
<field name="arch" type="xml">
<tree>
<field name="name" required="1"/>
</tree>
</field>
</record>
<!--FORM VIEW [DEPARTMENTS]-->
<record model="ir.ui.view" id="view_departments_form">
<field name="name">pha_marketing.departments.form</field>
<field name="model">pha_marketing.departments</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="name" required="1"/>
</group>
</sheet>
</form>
</field>
</record>
<!--ACTION [DEPARTMENTS]-->
<record id="action_departments" model="ir.actions.act_window">
<field name="name">Departments</field>
<field name="res_model">pha_marketing.departments</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<!--MENU [DEPARTMENTS]-->
<menuitem action="action_departments"
id="menu_departments" parent="medical_feature.menu_med_conf"
sequence="2"/>
<!--KANBEN [RES.PARTNER] OVERRIDDEN-->
<record model="ir.ui.view" id="base.res_partner_kanban_view">
<field name="name">res.partner.kanban</field>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<kanban>
<field name="color"/>
<field name="display_name"/>
<field name="title"/>
<field name="email"/>
<field name="parent_id"/>
<field name="is_company"/>
<field name="function"/>
<field name="phone"/>
<field name="street"/>
<field name="street2"/>
<field name="zip"/>
<field name="city"/>
<field name="country_id"/>
<field name="mobile"/>
<field name="state_id"/>
<field name="category_id"/>
<field name="has_image"/>
<field name="doctor"/>
<field name="target"/>
<field name="total_sale"/>
<field name="related_rep"/>
<field name="specialist_in"/>
<templates>
<t t-name="kanban-box">
<div style="width: 100%; height:200px;color: navy; background-color: #ffe6f9; border: 2px solid #cc0099; padding: 5px;">
<table>
<tr>
<td >
<div style="width:20%">
<div style="width: 30%;" id="div_kanban_border">
<div class="oe_kanban_vignette oe_semantic_html_override">
<t t-set="border">oe_kanban_color_red</t>
<a type="open">
<t t-if="record.has_image.raw_value === true">
<img t-att-src="kanban_image('res.partner', 'image_small', record.id.value)" class="oe_kanban_image"/>
</t>
<t t-if="record.has_image.raw_value === false">
<t t-if="record.is_company.raw_value === true">
<img t-att-src='_s + "/base/static/src/img/company_image.png"' class="oe_kanban_image"/>
</t>
<t t-if="record.is_company.raw_value === false">
<img t-att-src='_s + "/base/static/src/img/avatar.png"' class="oe_kanban_image"/>
</t>
</t>
</a>
<div class="oe_kanban_details">
<h4 class="oe_partner_heading"><a type="open"><field name="display_name"/></a></h4>
<h5><field name="specialist_in"/></h5>
<div class="oe_kanban_partner_categories"/>
<div class="oe_kanban_partner_links"/>
<ul>
<li t-if="record.parent_id.raw_value and !record.function.raw_value"><field name="parent_id"/></li>
<li t-if="!record.parent_id.raw_value and record.function.raw_value"><field name="function"/></li>
<li t-if="record.parent_id.raw_value and record.function.raw_value"><field name="function"/> at <field name="parent_id"/></li>
<li t-if="record.city.raw_value and !record.country_id.raw_value"><field name="city"/></li>
<li t-if="!record.city.raw_value and record.country_id.raw_value"><field name="country_id"/></li>
<li t-if="record.city.raw_value and record.country_id.raw_value"><field name="city"/>, <field name="country_id"/></li>
<li t-if="record.email.raw_value"><a t-attf-href="mailto:#{record.email.raw_value}"><field name="email"/></a></li>
</ul>
</div>
</div>
</div>
</div>
</td>
<td>
<div attrs="{'invisible': [('target', '=', 0)]}" style="width: 30%;">
<div class="oe_center" attrs="{'invisible': [('doctor', '=', False)]}">
<field name="total_sale" widget="gauge" style="width:120px; height: 90px; cursor: pointer;"
options="{'max_field': 'target'}">Target</field>
<h5 style="color:black;">Related Rep.</h5>
<field name="related_rep" string="Related Rep."/>
</div>
</div>
</td>
</tr>
</table>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!--KANBEN [HR.EMPLOYEE] OVERRIDDEN-->
<record model="ir.ui.view" id="hr.hr_kanban_view_employees">
<field name="name">HR - Employess Kanban</field>
<field name="model">hr.employee</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<kanban>
<field name="last_login"/>
<field name="message_is_follower"/>
<field name="message_follower_ids"/>
<field name="message_ids"/>
<field name="rep"/>
<field name="target"/>
<field name="total_sale"/>
<templates>
<t t-name="kanban-box">
<div style="width: 100%; height:200px;color: navy; background-color: #cce0ff; border: 2px solid #0066ff; padding: 5px;">
<div class="oe_employee_vignette">
<div class="oe_employee_image">
<a type="open"><img t-att-src="kanban_image('hr.employee', 'image_medium', record.id.value)" class="oe_employee_picture"/></a>
</div>
<div class="oe_employee_details">
<h4>
<a type="open"><field name="name"/><t t-if="record.login.raw_value"> (<field name="login"/>)</t></a>
</h4>
<ul>
<li id="last_login">
<span t-if="record.last_login.raw_value &amp;&amp; record.last_login.raw_value.is().today()" class="oe_kanban_button" style="font-size: 100%%">
<t t-esc="record.last_login.raw_value.toString('HH:mm')"/>
</span>
</li>
<li t-if="record.job_id.raw_value"><field name="job_id"/></li>
<li t-if="record.work_location.raw_value"><field name="work_location"/></li>
<li t-if="record.work_email.raw_value"><a t-attf-href="mailto:#{record.work_email.value}"><field name="work_email"/></a></li>
</ul>
<div class="oe_kanban_footer_left">
<div attrs="{'invisible': [('target', '=', 0)]}">
<div class="oe_center" attrs="{'invisible': [('rep', '=', False)]}">
<field name="total_sale" widget="gauge" style="width:120px; height: 90px; cursor: pointer;"
options="{'max_field': 'target'}">Target</field>
</div>
</div>
<span title='Messages'><span class='oe_e'>9</span><t t-esc="record.message_ids.raw_value.length"/></span>
<span title='Followers'><span class='oe_e'>+</span><t t-esc="record.message_follower_ids.raw_value.length"/></span>
</div>
<div class="oe_followers" groups="base.group_user">
<button t-if="record.message_is_follower.raw_value" name="action_unfollow" type="object" class="oe_follower oe_following">
<span class="oe_unfollow">Unfollow</span>
<span class="oe_following">Following</span>
</button>
<button t-if="! record.message_is_follower.raw_value" name="action_follow" type="object" class="oe_follower oe_notfollow">Follow</button>
</div>
</div>
</div>
</div>
<script>
$('.oe_employee_picture').load(function() { if($(this).width() > $(this).height()) { $(this).addClass('oe_employee_picture_wide') } });
</script>
</t>
</templates>
</kanban>
</field>
</record>
</data>
</openerp>

65
med_marketing/views/rep_view.xml

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--SEARCH[EMPLOYEE]-->
<record id="view_employee_filter" model="ir.ui.view">
<field name="name">Employees</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_filter"/>
<field name="arch" type="xml">
<xpath expr="//group[@string='Group By']" position="before">
<filter name="filter_rep" string="Medical Representative" icon="terp-personal+" domain="[('rep', '=', True)]"/>
<separator/>
</xpath>
</field>
</record>
<!--FORM [EMPLOYEE]-->
<record id="view_employee_form_inherit" model="ir.ui.view">
<field name="name">hr.employee.form.inherit</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<xpath expr="//label[@for='name']" position="before">
<h4>
<field name="rep" class="oe_inline"/> <label for="rep" string="Is a Medical Representative?"/>
</h4>
<br/>
</xpath>
<xpath expr="//group[@name='active_group']" position="after">
<group string="Commission" attrs="{'invisible':[('rep','=',False)]}">
<field name="commission"/>
<field name="target"/>
<field name="total_sale"/>
</group>
</xpath>
</field>
</record>
<!--ACTION [REP]-->
<record id="action_rep" model="ir.actions.act_window">
<field name="name">Medical Representatives</field>
<field name="res_model">hr.employee</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="domain">[]</field>
<field name="context">{"search_default_filter_rep":1, "default_rep":1}</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="hr.view_employee_filter"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a new employee.
</p><p>
With just a quick glance on the Odoo employee screen, you
can easily find all the information you need for each person;
contact data, job position, availability, etc.
</p>
</field>
</record>
<!--MENU [REP]-->
<menuitem action="action_rep"
id="menu_rep"
sequence="4"
parent="med_marketing.menu_marketing"/>
</data>
</openerp>

1
medical_feature/__init__.py

@ -0,0 +1 @@
import pharmacy_mgt,route_manage,expiry_manage

28
medical_feature/__openerp__.py

@ -0,0 +1,28 @@
{
'name': "Pharmacy Management",
'summary': """ Some Basics For Field of Medicine """,
'description': """ """,
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'license': 'AGPL-3',
'category': 'Medicine',
'version': '0.1',
'depends': ["base",
"sale",
"purchase",
"stock",
"mrp",
"mrp_operations",
"product_expiry",
"account_accountant"],
'data': ['views/pharmacy_mgt_view.xml',
'views/medicines_view.xml',
'route_manage/route_manage_view.xml',
'route_manage/report.xml', 'new_names.xml',
'expiry_manage/expiry_manage_view.xml',
],
'demo': ['demo/demo.xml'],
'installable': True,
'auto_install': False,
'application': True,
}

335
medical_feature/demo/demo.xml

@ -0,0 +1,335 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--DEMO LOCATIONS-->
<!--CALICUT-->
<record id="loc_0001" model="pharmacy_management.route.location">
<field name="name">Sm street</field>
</record>
<record id="loc_0002" model="pharmacy_management.route.location">
<field name="name">Manorama Junction</field>
</record>
<record id="loc_0003" model="pharmacy_management.route.location">
<field name="name">East Nadakavu Junction</field>
</record>
<record id="loc_0004" model="pharmacy_management.route.location">
<field name="name">Sarovaram</field>
</record>
<record id="loc_0005" model="pharmacy_management.route.location">
<field name="name">Mavoor Road</field>
</record>
<!--HYDERABAD-->
<record id="loc_0011" model="pharmacy_management.route.location">
<field name="name">Malakunta</field>
</record>
<record id="loc_0012" model="pharmacy_management.route.location">
<field name="name">Gruhkalpa</field>
</record>
<record id="loc_0013" model="pharmacy_management.route.location">
<field name="name">Band colony</field>
</record>
<record id="loc_0014" model="pharmacy_management.route.location">
<field name="name">Sultan Bazaar</field>
</record>
<record id="loc_0015" model="pharmacy_management.route.location">
<field name="name">Esamiya Bazaar</field>
</record>
<!--CHENNAI-->
<record id="loc_0021" model="pharmacy_management.route.location">
<field name="name">Royapettah</field>
</record>
<record id="loc_0022" model="pharmacy_management.route.location">
<field name="name">Teynampet</field>
</record>
<record id="loc_0023" model="pharmacy_management.route.location">
<field name="name">T Nagar</field>
</record>
<record id="loc_0024" model="pharmacy_management.route.location">
<field name="name">Kodambakkam</field>
</record>
<record id="loc_0025" model="pharmacy_management.route.location">
<field name="name">Arumbakkam</field>
</record>
<!--KOLKATHA-->
<record id="loc_0051" model="pharmacy_management.route.location">
<field name="name">Lal Bazaar</field>
</record>
<record id="loc_0052" model="pharmacy_management.route.location">
<field name="name">Bow Bazaar</field>
</record>
<!--DEMO DATA FOR MEDICINE TYPES-->
<!--<record id="medicine_types-dat" model="product.medicine.types">-->
<!--<field name="id">1</field>-->
<!--<field name="medicine_type">Antibiotic</field>-->
<!--</record>-->
<!--<record id="medicine_types-dat1" model="product.medicine.types">-->
<!--<field name="id">2</field>-->
<!--<field name="medicine_type">Pathogen</field>-->
<!--</record>-->
<!--<record id="medicine_types-dat2" model="product.medicine.types">-->
<!--<field name="id">3</field>-->
<!--<field name="medicine_type">Cells</field>-->
<!--</record>-->
<!--DEMO MEDICINES-->
<!--ANTIBIOTICS-->
<!--<record id="medicine1" model="product.product">-->
<!--<field name="name">Daptomycin</field>-->
<!--<field name="standard_price">10.0</field>-->
<!--<field name="list_price">10.0</field>-->
<!--<field name="medicine_type" ref="medicine_types-dat"/>-->
<!--</record>-->
<!--<record id="medicine2" model="product.product">-->
<!--<field name="name">Linezolid</field>-->
<!--<field name="standard_price">10.0</field>-->
<!--<field name="list_price">10.0</field>-->
<!--<field name="medicine_type" ref="medicine_types-dat"/>-->
<!--</record>-->
<!--<record id="medicine3" model="product.product">-->
<!--<field name="name">XXXXXXXXXXX0000003</field>-->
<!--<field name="standard_price">10.0</field>-->
<!--<field name="list_price">10.0</field>-->
<!--<field name="medicine_type" ref="medicine_types-dat"/>-->
<!--</record>-->
<!--&lt;!&ndash;PATHOGENS&ndash;&gt;-->
<!--<record id="medicine4" model="product.product">-->
<!--<field name="name">XXXXXXXXXXX0000004</field>-->
<!--<field name="standard_price">10.0</field>-->
<!--<field name="list_price">10.0</field>-->
<!--<field name="medicine_type" ref="medicine_types-dat1"/>-->
<!--</record>-->
<!--<record id="medicine5" model="product.product">-->
<!--<field name="name">XXXXXXXXXXX0000005</field>-->
<!--<field name="standard_price">10.0</field>-->
<!--<field name="list_price">10.0</field>-->
<!--<field name="medicine_type" ref="medicine_types-dat1"/>-->
<!--</record>-->
<!--<record id="medicine6" model="product.product">-->
<!--<field name="name">XXXXXXXXXXX0000006</field>-->
<!--<field name="standard_price">10.0</field>-->
<!--<field name="list_price">10.0</field>-->
<!--<field name="medicine_type" ref="medicine_types-dat1"/>-->
<!--</record>-->
<!--&lt;!&ndash;CELLS&ndash;&gt;-->
<!--<record id="medicine7" model="product.product">-->
<!--<field name="name">XXXXXXXXXXX0000007</field>-->
<!--<field name="standard_price">10.0</field>-->
<!--<field name="list_price">10.0</field>-->
<!--<field name="medicine_type" ref="medicine_types-dat2"/>-->
<!--</record>-->
<!--<record id="medicine8" model="product.product">-->
<!--<field name="name">XXXXXXXXXXX0000008</field>-->
<!--<field name="standard_price">10.0</field>-->
<!--<field name="list_price">10.0</field>-->
<!--<field name="medicine_type" ref="medicine_types-dat2"/>-->
<!--</record>-->
<!--<record id="medicine9" model="product.product">-->
<!--<field name="name">XXXXXXXXXXX0000009</field>-->
<!--<field name="standard_price">10.0</field>-->
<!--<field name="list_price">10.0</field>-->
<!--<field name="medicine_type" ref="medicine_types-dat2"/>-->
<!--</record>-->
<!--DEMO ROUTES-->
<record id="route1" model="pharmacy_management.route">
<field name="name">Kolkata</field>
<field name="route_code">KLT</field>
<field name="distributor" ref="base.user_root"/>
<field name="location_list1" eval="[(6, 0, [ref('loc_0051'), ref('loc_0052')])]"/>
</record>
<record id="route2" model="pharmacy_management.route">
<field name="name">Mumbai</field>
<field name="route_code">MBI</field>
<field name="distributor" ref="base.user_demo"/>
</record>
<record id="route3" model="pharmacy_management.route">
<field name="name">New Delhi</field>
<field name="route_code">DLH</field>
<field name="distributor" ref="base.user_demo"/>
</record>
<record id="route4" model="pharmacy_management.route">
<field name="name">Chennai</field>
<field name="route_code">CHN</field>
<field name="distributor" ref="base.user_root"/>
<field name="location_list1" eval="[(6, 0, [ref('loc_0021'), ref('loc_0022'), ref('loc_0023'),ref('loc_0024'),ref('loc_0025')])]"/>
</record>
<record id="route5" model="pharmacy_management.route">
<field name="name">Hyderabad</field>
<field name="route_code">HBD</field>
<field name="distributor" ref="base.user_root"/>
<field name="location_list1" eval="[(6, 0, [ref('loc_0011'), ref('loc_0012'), ref('loc_0013'),ref('loc_0014'),ref('loc_0015')])]"/>
</record>
<record id="route6" model="pharmacy_management.route">
<field name="name">Calicut</field>
<field name="route_code">CLT</field>
<field name="distributor" ref="base.user_root"/>
<field name="location_list1" eval="[(6, 0, [ref('loc_0001'), ref('loc_0002'), ref('loc_0003'),ref('loc_0004'),ref('loc_0005')])]"/>
</record>
<!--DEMO MEDICINE TYPES-->
<record id="medicine_types_1" model="product.medicine.types">
<field name="id">11</field>
<field name="medicine_type">Eye</field>
</record>
<record id="medicine_types_2" model="product.medicine.types">
<field name="id">12</field>
<field name="medicine_type">Ear, Nose and Oropharynx</field>
</record>
<record id="medicine_types_3" model="product.medicine.types">
<field name="id">13</field>
<field name="medicine_type">Skin</field>
</record>
<record id="medicine_types_4" model="product.medicine.types">
<field name="id">14</field>
<field name="medicine_type">Infections and Infestations</field>
</record>
<record id="medicine_types_5" model="product.medicine.types">
<field name="id">15</field>
<field name="medicine_type">Allergic disorders</field>
</record>
<record id="medicine_types_6" model="product.medicine.types">
<field name="id">16</field>
<field name="medicine_type">Gastrointestinal tract</field>
</record>
<record id="medicine_types_7" model="product.medicine.types">
<field name="id">17</field>
<field name="medicine_type">Nutrition</field>
</record>
<!--DEMO MEDICINES-->
<record id="medicines_001" model="product.product">
<field name="name">Acetylcysteine</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_1"/>
<field name="image" type="base64" file="medical_feature/static/img/Acetylcysteine.jpg"/>
</record>
<record id="medicines_00555" model="product.product">
<field name="name">Carbomer Liquid Eye Gels</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_1"/>
<field name="image" type="base64" file="medical_feature/static/img/Carbomer_liquid_eye_gels.jpg"/>
</record>
<record id="medicines_002" model="product.product">
<field name="name">Azithromycin</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_1"/>
<field name="image" type="base64" file="medical_feature/static/img/Azithromycin.jpg"/>
</record>
<record id="medicines_003" model="product.product">
<field name="name">Amoxicillin</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_2"/>
<field name="image" type="base64" file="medical_feature/static/img/er_amoxicillin-1.jpg"/>
</record>
<record id="medicines_004" model="product.product">
<field name="name">Clarithromycin</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_2"/>
<field name="image" type="base64" file="medical_feature/static/img/re_clarithromycin.jpg"/>
</record>
<record id="medicines_005" model="product.product">
<field name="name">Celiprolol</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_5"/>
<field name="image" type="base64" file="medical_feature/static/img/allr_Celiprolol.jpg"/>
</record>
<record id="medicines_006" model="product.product">
<field name="name">Cetirizine</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_5"/>
<field name="image" type="base64" file="medical_feature/static/img/allr_Cetirizine.jpg"/>
</record>
<record id="medicines_007" model="product.product">
<field name="name">Dimethindene</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_5"/>
<field name="image" type="base64" file="medical_feature/static/img/allr_Dimethindene.jpg"/>
</record>
<record id="medicines_008" model="product.product">
<field name="name">Aciphex</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_6"/>
<field name="image" type="base64" file="medical_feature/static/img/gs_Aciphex.jpg"/>
</record>
<record id="9" model="product.product">
<field name="name">Gastrogafin</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_6"/>
<field name="image" type="base64" file="medical_feature/static/img/gs_gastrogafin.jpg"/>
</record>
<record id="10" model="product.product">
<field name="name">Gleevec</field>
<field name="standard_price">10.0</field>
<field name="list_price">10.0</field>
<field name="medicine_type" ref="medicine_types_6"/>
<field name="image" type="base64" file="medical_feature/static/img/gs_Gleevec.jpg"/>
</record>
<!--DEMO LOTS-->
<record id="lot_0001" model="stock.production.lot">
<field name="name">AE00G5K220001</field>
<field name="product_id" ref="medicines_001"/>
<field name="use_date" eval="time.strftime('%Y-%m') + '-08'"/>
</record>
<record id="lot_0002" model="stock.production.lot">
<field name="name">AE00G5K220002</field>
<field name="product_id" ref="medicines_002"/>
<field name="life_date" eval="time.strftime('%Y-%m') + '-10'"/>
</record>
<record id="lot_0003" model="stock.production.lot">
<field name="name">AE00G5K220003</field>
<field name="product_id" ref="medicines_002"/>
<field name="life_date" eval="time.strftime('%Y-%m') + '-11'"/>
</record>
</data>
</openerp>

1
medical_feature/expiry_manage/__init__.py

@ -0,0 +1 @@
import expiry_manage

52
medical_feature/expiry_manage/expiry_manage.py

@ -0,0 +1,52 @@
from openerp import models, fields, _
from openerp import api
import datetime
from dateutil import parser
class StockTransferDetailsItems(models.TransientModel):
_inherit = 'stock.transfer_details_items'
lot_id = fields.Many2one('stock.production.lot', 'Lot/Serial Number')
@api.onchange('lot_id')
def when_items_changes_(self):
# ALERT DATE [alert_date]
if self.lot_id.alert_date is not False and parser.parse(self.lot_id.alert_date) < datetime.datetime.now():
return {'warning': {'title': _('Warning'), 'message': _('The lot \''+self.lot_id.name+'\' of '+' medicine \''+self.lot_id.product_id.name+'\'\n must not be consumed and should be removed from the stock.')}}
# REMOVAL DATE [removal_date]
if self.lot_id.removal_date is not False and parser.parse(self.lot_id.removal_date) < datetime.datetime.now():
return {'warning': {'title': _('Warning'), 'message': _('The lot \''+self.lot_id.name+'\' of '+' medicine \''+self.lot_id.product_id.name+'\'\n must not be consumed and should be removed from the stock.')}}
# END OF LIFE DATE [life_date]
if self.lot_id.life_date is not False and parser.parse(self.lot_id.life_date) < datetime.datetime.now():
return {'warning': {'title': _('Warning'), 'message': _('The lot \''+self.lot_id.name+'\' of '+' medicine \''+self.lot_id.product_id.name+'\'\n is dangerous and must not be consumed.')}}
# BEST BEFORE DATE [use_date]
if self.lot_id.use_date is not False and parser.parse(self.lot_id.use_date) < datetime.datetime.now():
return {'warning': {'title': _('Warning'), 'message': _('The lot \''+self.lot_id.name+'\' of '+' medicine \''+self.lot_id.product_id.name+'\'\n is not good for use now.')}}
class AddColorSerialNo(models.Model):
_inherit = 'stock.production.lot'
def _get_default_vals(self):
for each_lots in self:
if each_lots.alert_date is not False and parser.parse(each_lots.alert_date) < datetime.datetime.now():
each_lots.state = 'red'
elif each_lots.removal_date is not False and parser.parse(each_lots.removal_date) < datetime.datetime.now():
each_lots.state = 'red'
elif each_lots.life_date is not False and parser.parse(each_lots.life_date) < datetime.datetime.now():
each_lots.state = 'red'
elif each_lots.use_date is not False and parser.parse(each_lots.use_date) < datetime.datetime.now():
each_lots.state = 'lite_red'
else:
each_lots.state = 'normal'
state = fields.Selection([('normal', 'Normal'),
('lite_red', 'Not Good'),
('red', 'To Be Removed')],
string='Status',
compute=lambda self: self._get_default_vals()
# default=lambda self: self._get_default_vals()
)

56
medical_feature/expiry_manage/expiry_manage_view.xml

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--TREE [LOTS]-->
<record id="stock.view_production_lot_tree" model="ir.ui.view">
<field name="name">stock.production.lot.tree</field>
<field name="model">stock.production.lot</field>
<field name="arch" type="xml">
<tree string="Serial Number" colors="red:state=='red';#ff8080:state=='lite_red'">
<field name="name"/>
<field name="ref"/>
<field name="product_id"/>
<field name="create_date"/>
<field name="state"/>
</tree>
</field>
</record>
<!--SEARCH [LOTS]-->
<record model="ir.ui.view" id="search_med_lot_filter">
<field name="name">Production Lots Filter</field>
<field name="model">stock.production.lot</field>
<field name="arch" type="xml">
<search string="Product Lots Filter">
<field name="name" string="Product Lots" filter_domain="['|',('name','ilike',self),('ref','ilike',self)]"/>
<field name="product_id"/>
<group expand="0" string="Group By">
<filter string="Medicines" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
</group>
</search>
</field>
</record>
<!--ACTION [LOTS]-->
<record id="action_med_lot" model="ir.actions.act_window">
<field name="name">Serial Numbers</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">stock.production.lot</field>
<field name="view_type">form</field>
<field name="view_id" ref="stock.view_production_lot_tree"/>
<field name="search_view_id" ref="search_med_lot_filter"/>
<field name="context">{}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a serial number.
</p><p>
This is the list of all the production lots you recorded. When
you select a lot, you can get the traceability of the products contained in lot.
</p>
</field>
</record>
<!--MENU [LOTS]-->
<menuitem action="action_med_lot" id="menu_action_med_lot_form"
parent="medical_feature.menu_med"
sequence="40"
groups="stock.group_production_lot"/>
</data>
</openerp>

170
medical_feature/new_names.xml

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--IN SALES-->
<!--=====================================================-->
<record model="ir.ui.menu" id="base.menu_partner_form">
<field name="name">Retailers</field>
</record>
<record id="base.action_partner_form" model="ir.actions.act_window">
<field name="name">Retailers</field>
</record>
<!--=====================================================-->
<!--QUOTATIONS-->
<!--=====================================================-->
<record model="ir.ui.menu" id="sale.menu_sale_quotations">
<field name="name">Draft Orders</field>
</record>
<record id="sale.action_quotations" model="ir.actions.act_window">
<field name="name">Draft Orders</field>
</record>
<!--=====================================================-->
<!--SALE ORDERS-->
<!--=====================================================-->
<record model="ir.ui.menu" id="sale.menu_sale_order">
<field name="name">Confirmed Orders</field>
</record>
<record id="sale.action_orders" model="ir.actions.act_window">
<field name="name">Confirmed Orders</field>
</record>
<!--=====================================================-->
<!--PRODUCTS-->
<!--=====================================================-->
<record model="ir.ui.menu" id="base.menu_product">
<field name="name">Medicines</field>
</record>
<!--=====================================================-->
<record model="ir.ui.menu" id="product.menu_product_template_action">
<field name="name">Medicines</field>
</record>
<record id="product.product_template_action" model="ir.actions.act_window">
<field name="name">Medicines</field>
</record>
<!--=====================================================-->
<!--PRODUCT VARIANTS-->
<!--=====================================================-->
<record model="ir.ui.menu" id="product.menu_products">
<field name="name">Medicines Variants</field>
</record>
<record id="product.product_normal_action_sell" model="ir.actions.act_window">
<field name="name">Medicines Variants</field>
</record>
<!--=====================================================-->
<!--PRODUCT BY CATEGORY-->
<!--<record model="ir.ui.menu" id="product.menu_products_category">-->
<!--<field name="name">Medicines by Category</field>-->
<!--</record>-->
<!--<record id="product.product_category_action" model="ir.actions.act_window">-->
<!--<field name="name">Medicines by Category</field>-->
<!--</record>-->
<!--=====================================================-->
<!--IN PURCHASE-->
<!--=====================================================-->
<!--REQUESTS FOR QUOTATIONS-->
<!--=====================================================-->
<record model="ir.ui.menu" id="purchase.menu_purchase_rfq">
<field name="name">Draft Orders</field>
</record>
<record id="purchase.purchase_rfq" model="ir.actions.act_window">
<field name="name">Draft Orders</field>
</record>
<!--=====================================================-->
<!--PURCHASE ORDERS-->
<!--=====================================================-->
<record model="ir.ui.menu" id="purchase.menu_purchase_form_action">
<field name="name">Confirmed Orders</field>
</record>
<record id="purchase.purchase_form_action" model="ir.actions.act_window">
<field name="name">Confirmed Orders</field>
</record>
<!--=====================================================-->
<!--SUPPLIERS-->
<!--=====================================================-->
<record model="ir.ui.menu" id="base.menu_procurement_management_supplier_name">
<field name="name">Vendors</field>
</record>
<record id="base.action_partner_supplier_form" model="ir.actions.act_window">
<field name="name">Vendors</field>
</record>
<!--=====================================================-->
<!--PRODUCTS-->
<!--=====================================================-->
<record model="ir.ui.menu" id="purchase.menu_procurement_management_product">
<field name="name">Medicines</field>
</record>
<!--=====================================================-->
<record model="ir.ui.menu" id="purchase.menu_procurement_partner_contact_form">
<field name="name">Medicines</field>
</record>
<record id="purchase.product_normal_action_puchased" model="ir.actions.act_window">
<field name="name">Medicines</field>
</record>
<!--=====================================================-->
<!--PRODUCTS BY CATEGORY-->
<!--=====================================================-->
<!--<record model="ir.ui.menu" id="purchase.menu_product_by_category_purchase_form">-->
<!--<field name="name">Medicines by Category</field>-->
<!--</record>-->
<!--<record id="product.product_category_action" model="ir.actions.act_window">-->
<!--<field name="name">Medicines by Category</field>-->
<!--</record>-->
<!--=====================================================-->
<!--MESSAGING-->
<!--=====================================================-->
<record model="ir.ui.menu" id="mail.mail_feeds_main">
<field name="name">Talks</field>
</record>
<!--WAREHOUSE-->
<!--=====================================================-->
<!--WAREHOUSE [TOP]-->
<!--=====================================================-->
<record model="ir.ui.menu" id="stock.menu_stock_root">
<field name="name"> Stocks </field>
</record>
<!--=====================================================-->
<record model="ir.ui.menu" id="stock.menu_stock_product">
<field name="name">Medicines</field>
</record>
<!--<record model="ir.ui.menu" id="stock.menu_product_by_category_stock_form">-->
<!--<field name="name">Medicines by Category</field>-->
<!--</record>-->
<record model="ir.ui.menu" id="stock.menu_stock_products_menu">
<field name="name">Medicines</field>
</record>
<!--MANUFACTURING-->
<!--=====================================================-->
<!--PRODUCTS-->
<!--=====================================================-->
<record model="ir.ui.menu" id="mrp.menu_mrp_bom">
<field name="name"> Medicines </field>
</record>
<!--=====================================================-->
<record model="ir.ui.menu" id="mrp.menu_mrp_product_form">
<field name="name"> Medicines </field>
</record>
<record id="mrp.product_template_action" model="ir.actions.act_window">
<field name="name">Medicines</field>
</record>
<!--=====================================================-->
<!--=====================================================-->
<!--PRODUCT BY CATEGORY-->
<!--<record model="ir.ui.menu" id="product.menu_products_category">-->
<!--<field name="name">Medicines Hierarchy</field>-->
<!--</record>-->
<!--<record id="product.product_category_action" model="ir.actions.act_window">-->
<!--<field name="name">Medicines Hierarchy</field>-->
<!--</record>-->
<!--=====================================================-->
</data>
</openerp>

32
medical_feature/pharmacy_mgt.py

@ -0,0 +1,32 @@
from openerp import models, fields,api
class Medicines(models.Model):
_inherit = 'product.template'
medicine_category = fields.Selection([('allopathy', 'Allopathy'),
('ayurvedic', 'Ayurvedic'),
('homeo', 'Homeo'),
('generic', 'Generic'),
('none', 'None Medicine'),
('veterinary', 'Veterinary'), ], 'Medicine Type', default='generic')
medicine_type = fields.Many2one('product.medicine.types', 'Medicine Category')
product_of = fields.Many2one('product.medicine.responsible', 'Product Of')
class MedicineTypes(models.Model):
_name = 'product.medicine.types'
_rec_name = 'medicine_type'
medicine_type = fields.Char(string="Medicine Category")
class MedicineResponsible(models.Model):
_name = 'product.medicine.responsible'
_rec_name = 'name_responsible'
name_responsible = fields.Char(string="Product Of ")
related_vendor = fields.Many2one('res.partner', string='Related Vendor', domain="[('supplier', '=','1')]")
place = fields.Char(string="Place")

1
medical_feature/route_manage/__init__.py

@ -0,0 +1 @@
import route_mgt

30
medical_feature/route_manage/report.xml

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--PIVOT VIEW OF REPORT-->
<record id="view_report_sale_order_graph" model="ir.ui.view">
<field name="name">sale.order.route</field>
<field name="model">sale.order</field>
<field name="arch" type="xml">
<graph string="Sale Orders By Route" type="pivot">
<field name="name" type="col"/>
<field name="amount_total" type="measure"/>
<field name="route_of_customer" type="row"/>
</graph>
</field>
</record>
<!--ACTION OF REPORT-->
<record id="action_sale_order_by_route" model="ir.actions.act_window">
<field name="name">Sales Analysis By Routes</field>
<field name="res_model">sale.order</field>
<!--<field name="view_type">form</field>-->
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_sale_order_graph"/>
</record>
<menuitem action="action_sale_order_by_route"
id="menu_report_by_route"
parent="base.next_id_64"
sequence="10"/>
</data>
</openerp>

237
medical_feature/route_manage/route_manage_view.xml

@ -0,0 +1,237 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--KANBAN VIEW OF ROUTES-->
<record id="medical_feature.view_my_route_kanban" model="ir.ui.view">
<field name="name">pharmacy_management.route.kanban</field>
<field name="model">pharmacy_management.route</field>
<field name="arch" type="xml">
<kanban>
<field name="name"/>
<field name="route_code"/>
<field name="distributor"/>
<field name="customer_list"/>
<field name="count_customers"/>
<!--<field name="location_list"/>-->
<templates>
<t t-name="kanban-box">
<a type="open">
<div style="width: 300px;color: navy; background-color: #E0E0E0; border: 2px solid #4C4C4C; padding: 5px;">
<h4 style="color:#c2c2d6;">
<field name="route_code"/>
</h4>
<h2 style="color:#4C4C4C;">
<field name="name"/>
</h2>
<center>
<div style="color:#000000;">
<field name="distributor"/>
</div>
</center>
<span class="oe_kanban_list_many2many">
<field name="location_list1"/>
</span>
<div align="right" style="color:#7C7BAD;">
<field name="count_customers"/>
<label>Retailers</label>
</div>
</div>
</a>
</t>
</templates>
</kanban>
</field>
</record>
<!--SEARCH VIEW OF ROUTES-->
<record id="medical_feature.view_my_route_filter" model="ir.ui.view">
<field name="name">pharmacy_management.route.select</field>
<field name="model">pharmacy_management.route</field>
<field name="arch" type="xml">
<search>
<filter string="My" name="my_route" domain="[('distributor','=',uid)]"/>
</search>
</field>
</record>
<!--ACTION FOR ROUTES MENU-->
<record id="routes_menu_action" model="ir.actions.act_window">
<field name="name">Routes</field>
<field name="res_model">pharmacy_management.route</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="context">{"search_default_my_route":1}</field>
<field name="search_view_id" ref="view_my_route_filter"/>
</record>
<!-- TREE VIEW FOR ROUTES MENU-->
<record model="ir.ui.view" id="routes_menu_tree_view">
<field name="name">pharmacy_management.route.tree</field>
<field name="model">pharmacy_management.route</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="distributor"/>
</tree>
</field>
</record>
<!-- FORM VIEW FOR ROUTES MENU-->
<record model="ir.ui.view" id="routes_menu_form_view">
<field name="name">pharmacy_management.route.form</field>
<field name="model">pharmacy_management.route</field>
<field name="arch" type="xml">
<form>
<sheet>
<table>
<tr>
<td>
<group>
<field name="name" required="1" string="Route"/>
<field name="route_code" string="Route Code"/>
</group>
<group>
<field name="distributor" required="1" string="Distributor"/>
</group>
</td>
<td>
</td>
</tr>
</table>
<notebook>
<page string="Retailer">
<field name="customer_list" readonly="1">
<tree>
<field name="name"/>
<field name="mobile"/>
<field name="email"/>
</tree>
</field>
</page>
<page string="Locations">
<group col="2">
<div>
<group>
<field name="location_list1" widget="many2many_tags"/>
</group>
</div>
<div>
<button string="All Locations"
name="locations_btn"
icon="fa fa-arrow-right"
class="oe_stat_button"
type="object"/>
</div>
</group>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!--MENU ROUTES-->
<menuitem action="routes_menu_action"
id="distributing_routes"
sequence="1"
parent="medical_feature.menu_med_conf"/>
<!--ADD THE FIELD ROUTE IN CUSTOMER DATA -->
<record id="res_partner_route" model="ir.ui.view">
<field name="name">res.partner.route</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='parent_id']" position="before">
<label for="customer_route" string="Route" attrs="{'invisible': [('customer','=',False)]}"/>
<field name="customer_route"
attrs="{'invisible': [('customer','=',False)]}"
/>
<field name="id_of_route_distributor" attrs="{'invisible': True}"/>
</xpath>
</field>
</record>
<!--ADD THE FIELD ROUTE OF CUSTOMER IN SALE ORDER -->
<record id="sale_order_customer_route" model="ir.ui.view">
<field name="name">sale.order.customer_route</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='partner_id']" position="after">
<field name="route_of_customer" attrs="{'invisible':True}"/>
<field name="route_of_customer_to_show"/>
</xpath>
</field>
</record>
<!--ACTION TO OVERRIDE THE CUSTOMER MENU-->
<record id="base.action_partner_form" model="ir.actions.act_window">
<field name="name">Retailers</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="context">{"search_default_customer":1 ,"search_default_my_retailers":1}</field>
<field name="search_view_id" ref="base.view_res_partner_filter"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a contact in your address book.
</p><p>
Odoo helps you easily track all activities related to
a customer; discussions, history of business opportunities,
documents, etc.
</p>
</field>
</record>
<!--ADDING 'MY RETAILER' FILTER-->
<record model="ir.ui.view" id="res_partner_search_inherited">
<field name="name">res.partner.serach</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_res_partner_filter"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="before">
<filter string="In my area" name="my_retailers" domain="[('id_of_route_distributor','=',uid)]"/>
</xpath>
</field>
</record>
<!--Give CONTEXT FOR CUSTOMER IN FORM VIEW OF SALE ORDER-->
<record model="ir.ui.view" id="view_order_form_inherit_latest">
<field name="name">sale.order.form.inherit269</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="partner_id"]' position='attributes'>
<attribute name="domain">[('customer','=',True), ('id_of_route_distributor','=',uid)]</attribute>
<attribute name="context">{'search_default_customer':1, 'show_address': 1, 'search_default_my_retailers': 1 }</attribute>
</xpath>
</field>
</record>
<!--TREE [LOCATIONS]-->
<record model="ir.ui.view" id="routes_locations_menu_tree_view">
<field name="name">pharmacy_management.route.location.tree</field>
<field name="model">pharmacy_management.route.location</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
</tree>
</field>
</record>
<!--FORM [LOCATIONS]-->
<record model="ir.ui.view" id="routes_locations_menu_form_view">
<field name="name">pharmacy_management.route.location.form</field>
<field name="model">pharmacy_management.route.location</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="name"/>
</group>
</sheet>
</form>
</field>
</record>
</data>
</openerp>

89
medical_feature/route_manage/route_mgt.py

@ -0,0 +1,89 @@
from openerp import models, fields,_
from openerp import api
# ROUTE
class DistributionRoutes(models.Model):
_name = 'pharmacy_management.route'
name = fields.Char('Route Name')
route_code = fields.Char()
distributor = fields.Many2one('res.users', 'Distributor')
customer_list = fields.One2many('res.partner', 'customer_route')
@api.one
def _get_customer_count(self):
self.count_customers = len(self.customer_list)
count_customers = fields.Integer(compute='_get_customer_count')
# location_list = fields.One2many('pharmacy_management.route.location', 'route_id')
location_list1 = fields.Many2many('pharmacy_management.route.location', 'route_id', string='Locations')
def locations_btn(self, cr, uid, ids, context=None):
return {
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'pharmacy_management.route.location',
'view_id': False,
'type': 'ir.actions.act_window',
'name' : _('All Route Locations'),
}
# RETAILERS
class RouteInCustomer(models.Model):
_inherit = 'res.partner'
@api.onchange('customer_route')
def set_id_of_route_distributor(self):
print self.customer_route.distributor.id
self.id_of_route_distributor = self.customer_route.distributor.id
customer_route = fields.Many2one('pharmacy_management.route', 'Route')
id_of_route_distributor = fields.Integer()
# SALE ORDER
class RouteInSaleOrder(models.Model):
_inherit = 'sale.order'
route_of_customer = fields.Many2one('pharmacy_management.route', 'Route of Customer')
def onchange_partner_id(self, cr, uid, ids, part, context=None):
if not part:
return {'value': {'partner_invoice_id': False, 'partner_shipping_id': False, 'payment_term': False, 'fiscal_position': False}}
part = self.pool.get('res.partner').browse(cr, uid, part, context=context)
addr = self.pool.get('res.partner').address_get(cr, uid, [part.id], ['delivery', 'invoice', 'contact'])
pricelist = part.property_product_pricelist and part.property_product_pricelist.id or False
invoice_part = self.pool.get('res.partner').browse(cr, uid, addr['invoice'], context=context)
payment_term = invoice_part.property_payment_term and invoice_part.property_payment_term.id or False
dedicated_salesman = part.user_id and part.user_id.id or uid
val = {
'partner_invoice_id': addr['invoice'],
'partner_shipping_id': addr['delivery'],
'payment_term': payment_term,
'user_id': dedicated_salesman,
}
delivery_onchange = self.onchange_delivery_id(cr, uid, ids, False, part.id, addr['delivery'], False, context=context)
val.update(delivery_onchange['value'])
if pricelist:
val['pricelist_id'] = pricelist
if not self._get_default_section_id(cr, uid, context=context) and part.section_id:
val['section_id'] = part.section_id.id
sale_note = self.get_salenote(cr, uid, ids, part.id, context=context)
if sale_note: val.update({'note': sale_note})
# =================================================
val['route_of_customer'] = part.customer_route.id
# val['user_id'] = part.customer_route.distributor.id
return {'value': val}
def _get_route_of_customer_to_show(self):
self.route_of_customer_to_show = self.partner_id.customer_route.id
route_of_customer_to_show = fields.Many2one('pharmacy_management.route', 'Route of Customer' , compute='_get_route_of_customer_to_show')
class Locations(models.Model):
_name = 'pharmacy_management.route.location'
name = fields.Char('Location Name')
route_id = fields.Many2one('pharmacy_management.route')

BIN
medical_feature/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
medical_feature/static/img/Acetylcysteine.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
medical_feature/static/img/Azithromycin.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
medical_feature/static/img/Carbomer_liquid_eye_gels.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
medical_feature/static/img/allr_Celiprolol.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
medical_feature/static/img/allr_Cetirizine.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
medical_feature/static/img/allr_Dimethindene.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

BIN
medical_feature/static/img/er_amoxicillin-1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
medical_feature/static/img/gs_Aciphex.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
medical_feature/static/img/gs_Gleevec.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
medical_feature/static/img/gs_gastrogafin.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
medical_feature/static/img/re_clarithromycin.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

28
medical_feature/views/medicines_view.xml

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--====================================================-->
<!-- ACTION [MEDICINES]-->
<record id="action_medicines" model="ir.actions.act_window">
<field name="name">Medicines</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_type">form</field>
<field name="view_id" ref="product.product_template_kanban_view"/>
<field name="context">{"search_default_filter_to_sell":1, "search_default_medicine_type":1,}</field>
</record>
<!--====================================================-->
<!--MENU [MEDICINES]-->
<menuitem id="menu_med"
name="Medicines"
sequence="30"
parent="medical_feature.menu_med_features"/>
<menuitem id="menu_med_sub"
action="action_medicines"
sequence="30"
parent="medical_feature.menu_med"/>
<!--=====================================================-->
</data>
</openerp>

174
medical_feature/views/pharmacy_mgt_view.xml

@ -0,0 +1,174 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--GROUP [MEDICAL MANAGER]-->
<record model="res.groups" id="medical_feature.group_medical_user">
<field name="name">Medical Features Manager</field>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
<!--MAIN MENU [MEDICAL FEATURES]-->
<menuitem id="menu_med_features"
name="Medical Features"
sequence="11"/>
<!--MENU [SALES]-->
<menuitem id="menu_med_sale"
name="Sales"
sequence="20"
parent="medical_feature.menu_med_features"/>
<!--MENU [CONFIGURATION]-->
<menuitem id="menu_med_conf"
name="Configuration"
sequence="100"
parent="medical_feature.menu_med_features"
groups="medical_feature.group_medical_user" />
<!--FORM VIEW MEDICINE TYPES-->
<record model="ir.ui.view" id="form_medicine_types_view">
<field name="name">product.medicine.types.form</field>
<field name="model">product.medicine.types</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="medicine_type" required="1"/>
</group>
</sheet>
</form>
</field>
</record>
<!--TREE VIEW MEDICINE TYPES-->
<record model="ir.ui.view" id="tree_medicine_types_view">
<field name="name">product.medicine.types.tree</field>
<field name="model">product.medicine.types</field>
<field name="arch" type="xml">
<tree>
<field name="medicine_type"/>
</tree>
</field>
</record>
<!--ACTION MEDICINE TYPES-->
<record id="action_medicine_types" model="ir.actions.act_window">
<field name="name">Medicine Categories</field>
<field name="res_model">product.medicine.types</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<!--MENU MEDICINE TYPE-->
<menuitem action="action_medicine_types"
id="menu_med_types"
sequence="2"
parent="medical_feature.menu_med_conf"/>
<!--ADD MEDICINE CATEGORY AND RES IN FORM VIEW-->
<record id="product_template_form_view_inherited" model="ir.ui.view">
<field name="name">product.template.form.inherited</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_form_view" />
<field name="arch" type="xml">
<xpath expr="//field[@name='type']" position="after">
<field name="medicine_category"/>
<field name="medicine_type"/>
</xpath>
<xpath expr="//field[@name='sale_ok']" position="before">
<label for="product_of" string="Product Of"/>
<field name="product_of"/>
</xpath>
</field>
</record>
<!--CUSTOMIZE KANBAN VIEW OF PRODUCTS-->
<record id="product_template_kanban_view_inherited" model="ir.ui.view">
<field name="name">product.template.kanban.inherited</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_kanban_view" />
<field name="arch" type="xml">
<xpath expr="//div[@class='oe_kanban_details']" position="inside">
<font face = 'Tahoma' size = '3' color = 'ff6666'> <field name="product_of"/> </font>
</xpath>
</field>
</record>
<!--ADD FILTER MEDICINE TYPES-->
<record id="product_template_search_view_inherited" model="ir.ui.view">
<field name="name">product.template.form.inherited.new</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_search_view" />
<field name="arch" type="xml">
<xpath expr="//filter[@string='Type']" position="replace">
<filter string='Product Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
<filter string='Medicine Category' name="medicine_type" domain="[]" context="{'group_by' : 'medicine_type'}"/>
</xpath>
</field>
</record>
<!--OVERRIDING ACTION -->
<record id="product.product_template_action" model="ir.actions.act_window">
<field name="name">Medicines</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_type">form</field>
<field name="view_id" ref="product.product_template_kanban_view"/>
<field name="context">{"search_default_filter_to_sell":1, "search_default_medicine_type":1,}</field>
</record>
<!--FOR PRODUCT OF -->
<!--FORM VIEW PRODUCT OF-->
<record model="ir.ui.view" id="form_medicine_res_view">
<field name="name">product.medicine.responsible.form</field>
<field name="model">product.medicine.responsible</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="name_responsible" required="1"/>
<field name="related_vendor"/>
<field name="place"/>
</group>
</sheet>
</form>
</field>
</record>
<!--TREE VIEW PRODUCT OF-->
<record model="ir.ui.view" id="tree_medicine_res_view">
<field name="name">product.medicine.responsible.tree</field>
<field name="model">product.medicine.responsible</field>
<field name="arch" type="xml">
<tree>
<field name="name_responsible"/>
<field name="related_vendor"/>
<field name="place"/>
</tree>
</field>
</record>
<!--ACTION PRODUCT OF-->
<record id="action_medicine_res" model="ir.actions.act_window">
<field name="name">Medicine Responsible</field>
<field name="res_model">product.medicine.responsible</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<!--MENU PRODUCT OF-->
<menuitem action="action_medicine_res"
id="menu_med_res"
sequence="3"
parent="medical_feature.menu_med_conf"/>
<!-- ADD ADMIN TO SERIAL NUMBERS-->
<record id="stock.group_production_lot" model="res.groups">
<field name="name">Manage Lots / Serial Numbers</field>
<field name="category_id" ref="base.module_category_hidden"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
<!--MENU RETAILERS-->
<menuitem action="base.action_partner_form"
id="menu_retailers_med"
sequence="1"
parent="medical_feature.menu_med_sale"
name="Retailers"/>
</data>
</openerp>

1
pos_product_category_filter/__init__.py

@ -0,0 +1 @@
import models

27
pos_product_category_filter/__openerp__.py

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'POS Product Category Filter',
'version': '1.0',
'category': 'Point of Sale',
'sequence': 6,
'summary': 'Show only specified categories of product in point of sale ',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'website': 'http://www.cybrosys.com',
'description': """
=======================
""",
'depends': ['point_of_sale'],
'data': ['views/custom_view.xml',
'views/template.xml'],
'qweb': [],
'installable': True,
'auto_install': False,
}

27
pos_product_category_filter/__openerp__.py~

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'POS Product Category Filter',
'version': '1.0',
'category': 'Point of Sale',
'sequence': 6,
'summary': 'Show only specified categories of product in point of sale ',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'website': 'http://www.cybrosys.com',
'description': """
=======================
Customization of produc availablity in PoS.
""",
'depends': ['point_of_sale'],
'data': ['views/custom_view.xml',
'views/template.xml'],
'qweb': [],
'installable': True,
'auto_install': False,
}

1
pos_product_category_filter/models/__init__.py

@ -0,0 +1 @@
import custom

16
pos_product_category_filter/models/custom.py

@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
from openerp import models, fields, api
class PosProductCateg(models.Model):
_inherit = 'pos.config'
available_categ = fields.Many2many('pos.category', string='Available Product Categories')
#
class PosCateg(models.Model):
#
_name = 'pos.custom'

32
pos_product_category_filter/static/description/index.html

@ -0,0 +1,32 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">Point of Sale : Setting Product Categories for POS</h2>
<div>
<p class='oe_mt32'>
By installing this module, we can set available product categories for each POS in our system.
Only those categories set in the POS will be available in that particular POS.
</p>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row">
<h4 class="oe_slogan">You can set it in POS form as: </h4>
<div>
<p class='oe_mt32'>
Point of sale > Configuration > Point of Sale > Available Product Categories.
</p>
</div>
<div>
<div class="oe_bg_img">
<img class="oe_picture oe_screenshot" src="pos.png">
</div>
</div>
</div>
</section>
<section class="oe_container oe_separator">
</section>

48
pos_product_category_filter/static/description/index.html~

@ -0,0 +1,48 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">Point of Sale : Setting Product Categories for POS</h2>
<div>
<p class='oe_mt32'>
By installing this module, we can set available product categories for each POS in our system.
Only those categories set in the POS will be available in that particular POS.
</p>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row">
<h4 class="oe_slogan">You can set it in POS form as: </h4>
<div>
<p class='oe_mt32'>
Point of sale > Configuration > Point of Sale > Available Product Categories.
</p>
</div>
<div>
<div class="oe_bg_img">
<img class="oe_picture oe_screenshot" src="pos.png">
</div>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row">
<h4 class="oe_slogan">Setting Product category</h4>
<div>
<p>
1) If a root category is given all the subcategories and products under that category will be available.
</p>
<p>
2) If an intermediate category(ie. one with parent and child categories) is given then parent category and all child categories will be available.
</p>
<p>
3) If a child category(ie. one without any child categories), the category can be reached by traversing its ancestor categories.
</p>
</div>
</div>
</section>
<section class="oe_container oe_separator">
</section>

BIN
pos_product_category_filter/static/description/pos.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

214
pos_product_category_filter/static/src/js/category.js

@ -0,0 +1,214 @@
openerp.pos_product_category_filter = function(instance){
var module = instance.point_of_sale;
var models = module.PosModel.prototype;
var round_pr = instance.web.round_precision
var model1 = {
model: 'pos.category',
fields: ['id','name','parent_id','child_id','image'],
domain: null,
loaded: function(self, categories){
for(var i = 0, len = categories.length; i < len; i++){
categories[i].available = false;
for(var j = 0, jlen = self.config.available_categ.length; j < jlen; j++){
if(categories[i].id == self.config.available_categ[j]){
categories[i].available = true;
}
}
}
self.db.add_categories(categories);
},
}
for(var i=0; i< models.models.length; i++){
var model=models.models[i];
if(model.model === 'pos.category'){
models.models[i] = model1;
}
}
module.PosDB.include({
add_categories: function(categories){
var self = this;
if(!this.category_by_id[this.root_category_id]){
this.category_by_id[this.root_category_id] = {
id : this.root_category_id,
name : 'Root',
};
}
for(var i=0, len = categories.length; i < len; i++){
if(categories[i].available === true){
categories[i].parent_id[0] = 0;
}
}
for(var i=0, len = categories.length; i < len; i++){
this.category_by_id[categories[i].id] = categories[i];
}
for(var i=0, len = categories.length; i < len; i++){
var cat = categories[i];
var parent_id = cat.parent_id[0] || this.root_category_id;
this.category_parent[cat.id] = cat.parent_id[0];
if(!this.category_childs[parent_id]){
this.category_childs[parent_id] = [];
}
this.category_childs[parent_id].push(cat.id);
}
function make_ancestors(cat_id, ancestors){
self.category_ancestors[cat_id] = ancestors;
ancestors = ancestors.slice(0);
ancestors.push(cat_id);
var childs = self.category_childs[cat_id] || [];
for(var i=0, len = childs.length; i < len; i++){
make_ancestors(childs[i], ancestors);
}
}
make_ancestors(this.root_category_id, []);
},
add_products: function(products){
var stored_categories = this.product_by_category_id;
for(var i = 0, len = products.length; i < len; i++){
var ancestor_ids = this.get_category_ancestors_ids(products[i].pos_categ_id[0]);
products[i].pos_categ_ancestors = ancestor_ids;
}
for(var i = 0, len = products.length; i < len; i++){
products[i].available = false;
var category = this.get_category_by_id(products[i].pos_categ_id[0]);
if(category && category.available == true){
products[i].available = true;
}else{
if(products[i].pos_categ_ancestors){
for(var j = 0, jlen = products[i].pos_categ_ancestors.length; j < jlen; j++){
var temp_categ = this.get_category_by_id(products[i].pos_categ_ancestors[j])
if(temp_categ != 0 && temp_categ.available == true){
products[i].available = true;
}
}
}
}
}
if(!products instanceof Array){
products = [products];
}
for(var i = 0, len = products.length; i < len; i++){
var product = products[i];
var search_string = this._product_search_string(product);
var categ_id = product.pos_categ_id ? product.pos_categ_id[0] : this.root_category_id;
product.product_tmpl_id = product.product_tmpl_id[0];
if(!stored_categories[categ_id]){
stored_categories[categ_id] = [];
}
stored_categories[categ_id].push(product.id);
if(this.category_search_string[categ_id] === undefined){
this.category_search_string[categ_id] = '';
}
this.category_search_string[categ_id] += search_string;
var ancestors = this.get_category_ancestors_ids(categ_id) || [];
for(var j = 0, jlen = ancestors.length; j < jlen; j++){
var ancestor = ancestors[j];
if(! stored_categories[ancestor]){
stored_categories[ancestor] = [];
}
stored_categories[ancestor].push(product.id);
if( this.category_search_string[ancestor] === undefined){
this.category_search_string[ancestor] = '';
}
this.category_search_string[ancestor] += search_string;
}
this.product_by_id[product.id] = product;
if(product.ean13){
this.product_by_ean13[product.ean13] = product;
}
if(product.default_code){
this.product_by_reference[product.default_code] = product;
}
}
},
});
module.ProductCategoriesWidget.include({
renderElement: function(){
var db = this.pos.db;
var self = this;
var el_str = openerp.qweb.render(this.template, {widget: this});
var el_node = document.createElement('div');
el_node.innerHTML = el_str;
el_node = el_node.childNodes[1];
if(this.el && this.el.parentNode){
this.el.parentNode.replaceChild(el_node,this.el);
}
this.el = el_node;
var hasimages = false; //if none of the subcategories have images, we don't display buttons with icons
for(var i = 0; i < this.subcategories.length; i++){
if(this.subcategories[i].image){
hasimages = true;
break;
}
}
var list_container = el_node.querySelector('.category-list');
if (list_container) {
if (!hasimages) {
list_container.classList.add('simple');
} else {
list_container.classList.remove('simple');
}
for(var i = 0, len = this.subcategories.length; i < len; i++){
if(this.subcategories[i].available == true){
list_container.appendChild(this.render_category(this.subcategories[i],hasimages));
}else{
var ancestor_ids = db.get_category_ancestors_ids(this.subcategories[i].id)
for(var j = 0, jlen = ancestor_ids.length; j < jlen; j++){
if(ancestor_ids[j] != 0){
var ancestor = db.get_category_by_id(ancestor_ids[j])
if(ancestor.available == true){
list_container.appendChild(this.render_category(this.subcategories[i],hasimages));
}
}
}
}
};
}
var buttons = el_node.querySelectorAll('.js-category-switch');
for(var i = 0; i < buttons.length; i++){
buttons[i].addEventListener('click',this.switch_category_handler);
}
var products = this.pos.db.get_product_by_category(this.category.id);
var available_products = [];
for(var i = 0, len = products.length; i < len; i++){
if(products[i].available == true){
available_products.push(products[i]);
}
}
this.product_list_widget.set_product_list(available_products);
this.el.querySelector('.searchbox input').addEventListener('keyup',this.search_handler);
$('.searchbox input', this.el).keypress(function(e){
e.stopPropagation();
});
this.el.querySelector('.search-clear').addEventListener('click',this.clear_search_handler);
if(this.pos.config.iface_vkeyboard && this.pos_widget.onscreen_keyboard){
this.pos_widget.onscreen_keyboard.connect($(this.el.querySelector('.searchbox input')));
}
},
});
};

18
pos_product_category_filter/views/custom_view.xml

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="pos_config_main_form_view2" model="ir.ui.view">
<field name="name">pos.config.form.view.inherit</field>
<field name="model">pos.config</field>
<field name="inherit_id" ref="point_of_sale.view_pos_config_form"/>
<field name="arch" type="xml">
<xpath expr="//form[@string='Point of Sale Configuration']/sheet/group[@string='Features']/group/field[@name='iface_big_scrollbars']" position="after">
<field name="available_categ" widget="many2many_tags"></field>
</xpath>
</field>
</record>
</data>
</openerp>

12
pos_product_category_filter/views/template.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="assets_frontend" inherit_id="web.assets_common">
<xpath expr="." position="inside">
<script type="text/javascript" src="/pos_product_category_filter/static/src/js/category.js"></script>
</xpath>
</template>
</data>
</openerp>

3
sale_discount_total/__init__.py

@ -1 +1,2 @@
import models
import models
import report

8
sale_discount_total/__openerp__.py

@ -3,7 +3,7 @@
'version': '1.0',
'category': 'sale',
'sequence': 6,
'summary': "extension of default Sale Management module meant to provide discount for total amount",
'summary': "A module meant to provide discount for total amount and Discount limit with approval in sales",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'website': 'http://www.cybrosys.com',
@ -21,8 +21,10 @@ Module to manage discount for total amount in Sale.
'data': [
'views/sale_view.xml',
'views/account_invoice_view.xml',
'views/invoice_report.xml',
'views/sale_order_report.xml'
'views/invoice_report.xml',
'views/sale_order_report.xml',
'views/sale_discount_approval_view.xml',
'views/sale_discount_approval_workflow.xml'
],
'demo': [

6
sale_discount_total/__openerp__.py~

@ -20,7 +20,11 @@ Module to manage discount for total amount in Sale.
'depends': ['sale', 'base', 'stock'],
'data': [
'views/sale_view.xml',
'views/account_invoice_view.xml'
'views/account_invoice_view.xml',
'views/invoice_report.xml',
'views/sale_order_report.xml',
'views/sale_discount_approval_view.xml',
'views/sale_discount_approval_workflow.xml'
],
'demo': [

1
sale_discount_total/models/__init__.py

@ -1,2 +1,3 @@
import account_invoice
import sale
import sale_discount_approval

2
sale_discount_total/models/__init__.py~

@ -0,0 +1,2 @@
import account_invoice
import sale

94
sale_discount_total/models/account_invoice.py

@ -3,25 +3,38 @@ from openerp.osv import osv
import openerp.addons.decimal_precision as dp
class AccountInvoiceLine(models.Model):
_inherit = "account.invoice.line"
discount = fields.Float(string='Discount (%)',
digits=(16, 10),
# digits= dp.get_precision('Discount'),
default=0.0)
class AccountInvoice(models.Model):
_inherit = "account.invoice"
@api.one
@api.depends('invoice_line.price_subtotal', 'tax_line.amount')
def _compute_amount(self):
disc = 0.0
for inv in self:
for line in inv.invoice_line:
print line.discount
disc += (line.quantity * line.price_unit) * line.discount / 100
self.amount_untaxed = sum(line.price_subtotal for line in self.invoice_line)
self.amount_tax = sum(line.amount for line in self.tax_line)
if self.discount_type == 'percent':
self.amount_discount = ((self.amount_untaxed + self.amount_tax) * self.discount_rate) / 100
elif self.discount_type == 'amount':
self.amount_discount = self.discount_rate
self.amount_total = self.amount_untaxed + self.amount_tax - self.amount_discount
self.amount_discount = disc
self.amount_total = self.amount_untaxed + self.amount_tax
discount_type = fields.Selection([('percent', 'Percentage'), ('amount', 'Amount')], 'Discount Type', readonly=True,
states={'draft': [('readonly', False)]})
discount_rate = fields.Float('Discount Rate', digits_compute=dp.get_precision('Account'), readonly=True,
discount_rate = fields.Float('Discount Rate',
digits_compute=dp.get_precision('Account'),
readonly=True,
states={'draft': [('readonly', False)]})
amount_discount = fields.Float(string='Discount', digits=dp.get_precision('Account'),
amount_discount = fields.Float(string='Discount',
digits=dp.get_precision('Account'),
readonly=True, compute='_compute_amount')
amount_untaxed = fields.Float(string='Subtotal', digits=dp.get_precision('Account'),
readonly=True, compute='_compute_amount', track_visibility='always')
@ -30,23 +43,40 @@ class AccountInvoice(models.Model):
amount_total = fields.Float(string='Total', digits=dp.get_precision('Account'),
readonly=True, compute='_compute_amount')
@api.multi
def compute_discount(self, discount):
for inv in self:
val1 = val2 = 0.0
disc_amnt = 0.0
val2 = sum(line.amount for line in self.tax_line)
for line in inv.invoice_line:
val1 += (line.quantity * line.price_unit)
line.discount = discount
disc_amnt += (line.quantity * line.price_unit) * discount / 100
total = val1 + val2 - disc_amnt
self.amount_discount = disc_amnt
self.amount_tax = val2
self.amount_total = total
@api.onchange('discount_type', 'discount_rate')
def compute_discount(self):
def supply_rate(self):
for inv in self:
amount = sum(line.price_subtotal for line in self.invoice_line)
tax = sum(line.amount for line in self.tax_line)
if inv.discount_type == 'percent':
if inv.discount_rate == 100:
disc_amnt = amount + tax
else:
disc_amnt = (amount + tax) * inv.discount_rate / 100
total = amount + tax - disc_amnt
self.amount_discount = disc_amnt
self.amount_total = total
self.compute_discount(inv.discount_rate)
else:
total = (amount + tax) - inv.discount_rate
self.amount_discount = inv.discount_rate
self.amount_total = total
total = 0.0
discount = 0.0
for line in inv.invoice_line:
total += (line.quantity * line.price_unit)
if inv.discount_rate != 0:
print "#########################################"
discount = (inv.discount_rate / total) * 100
print dp.get_precision('Discount'),
print discount
self.compute_discount(discount)
@api.model
def _prepare_refund(self, invoice, date=None, period_id=None, description=None, journal_id=None):
@ -58,31 +88,3 @@ class AccountInvoice(models.Model):
})
return res
class invoice_line(osv.Model):
_inherit = 'account.invoice.line'
def move_line_get(self, cr, uid, invoice_id, context=None):
res = super(invoice_line, self).move_line_get(cr, uid, invoice_id, context=context)
inv = self.pool.get('account.invoice').browse(cr, uid, invoice_id, context=context)
if inv.type in ('out_invoice', 'out_refund') and inv.discount_type:
prop = self.pool.get('ir.property').get(cr, uid, 'property_account_income_categ', 'product.category',
context=context)
prop_id = prop and prop.id or False
account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, inv.fiscal_position or False,
prop_id)
sign = -1
res.append({
'name': 'Discount',
'price_unit': sign * inv.amount_discount,
'quantity': 1,
'price': sign * inv.amount_discount,
'account_id': account_id,
'product_id': False,
'uos_id': False,
'account_analytic_id': False,
'taxes': False,
})
return res

64
sale_discount_total/models/sale.py

@ -16,20 +16,16 @@ class SaleOrder(osv.Model):
'amount_tax': 0.0,
'amount_total': 0.0,
}
val = val1 = val2 = 0.0
cur = order.pricelist_id.currency_id
val1 = val2 = val3 = 0.0
for line in order.order_line:
val1 += line.price_subtotal
val += self._amount_line_tax(cr, uid, line, context=context)
if order.discount_type == 'amount':
val2 = order.discount_rate
elif order.discount_type == 'percent':
val2 = ((val1 + val) * order.discount_rate) / 100
res[order.id]['amount_tax'] = cur_obj.round(cr, uid, cur, val)
res[order.id]['amount_untaxed'] = cur_obj.round(cr, uid, cur, val1)
res[order.id]['amount_discount'] = cur_obj.round(cr, uid, cur, val2)
res[order.id]['amount_total'] = res[order.id]['amount_untaxed'] + res[order.id]['amount_tax'] - \
res[order.id]['amount_discount']
val2 += self._amount_line_tax(cr, uid, line, context=context)
val3 += (line.product_uom_qty * line.price_unit) * line.discount / 100
res[order.id]['amount_untaxed'] = round(cur_obj.round(cr, uid, cur, val1))
res[order.id]['amount_tax'] = round(cur_obj.round(cr, uid, cur, val2))
res[order.id]['amount_discount'] = round(cur_obj.round(cr, uid, cur, val3))
res[order.id]['amount_total'] = round(res[order.id]['amount_untaxed'] + res[order.id]['amount_tax'])
return res
def _get_order(self, cr, uid, ids, context=None):
@ -41,46 +37,52 @@ class SaleOrder(osv.Model):
_columns = {
'discount_type': fields.selection([
('percent', 'Percentage'),
('amount', 'Amount')], 'Discount Type'),
('amount', 'Amount')], 'Discount type'),
'discount_rate': fields.float('Discount Rate', digits_compute=dp.get_precision('Account'),
readonly=True,
states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, ),
'amount_discount': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Discount',
multi='sums', help="The total discount."),
multi='sums', store=True, help="The total discount."),
'amount_untaxed': fields.function(_amount_all, digits_compute=dp.get_precision('Account'),
string='Untaxed Amount',
multi='sums', help="The amount without tax.", track_visibility='always'),
multi='sums', store=True, help="The amount without tax.", track_visibility='always'),
'amount_tax': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Taxes',
multi='sums', help="The tax amount."),
multi='sums', store=True, help="The tax amount."),
'amount_total': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Total',
multi='sums', help="The total amount."),
multi='sums', store=True, help="The total amount."),
}
_defaults = {
'discount_type': 'percent',
}
@api.onchange('discount_type', 'discount_rate')
def compute_discount(self):
@api.multi
def compute_discount(self, discount):
for order in self:
val1 = val2 = 0.0
disc_amnt = 0.0
for line in order.order_line:
val1 += line.price_subtotal
val1 += (line.product_uom_qty * line.price_unit)
line.discount = discount
val2 += self._amount_line_tax(line)
disc_amnt += (line.product_uom_qty * line.price_unit * line.discount)/100
total = val1 + val2 - disc_amnt
self.currency_id = order.pricelist_id.currency_id
self.amount_discount = round(disc_amnt)
self.amount_tax = round(val2)
self.amount_total = round(total)
@api.onchange('discount_type', 'discount_rate')
def supply_rate(self):
for order in self:
if order.discount_type == 'percent':
if order.discount_rate == 100:
disc_amnt = val1 + val2
else:
disc_amnt = (val1 + val2) * order.discount_rate / 100
total = val1 + val2 - disc_amnt
self.currency_id = order.pricelist_id.currency_id
self.amount_discount = disc_amnt
self.amount_total = total
self.compute_discount(order.discount_rate)
else:
total = (val1 + val2) - order.discount_rate
self.currency_id = order.pricelist_id.currency_id
self.amount_discount = order.discount_rate
self.amount_total = total
total = 0.0
for line in order.order_line:
total += (line.product_uom_qty * line.price_unit)
discount = (order.discount_rate / total) * 100
self.compute_discount(discount)
def _prepare_invoice(self, cr, uid, order, lines, context=None):
invoice_vals = super(SaleOrder, self)._prepare_invoice(cr, uid, order, lines, context=context)

102
sale_discount_total/models/sale_discount_approval.py

@ -0,0 +1,102 @@
from openerp import api, models, fields
from openerp.osv import fields, osv
from openerp import SUPERUSER_ID
##############################################################sale settings##############################################################
class Sale_config_settings(osv.TransientModel):
_inherit = 'sale.config.settings'
_columns = {
'limit_discount': fields.integer('Discount limit requires approval %', required=True,
help="Discount after which approval of sale is required."),
'module_sale_discount_approval': fields.boolean("Force two levels of approvals",
help='Provide a double validation mechanism for sale exceeding minimum discount.\n'
),
}
_defaults = {
'limit_discount': 40,
}
def get_default_limit_discount(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
limit_discount = ir_values.get_default(cr, uid, 'sale.config.settings', 'limit_discount')
return {
'limit_discount': limit_discount,
}
def set_limit_discount(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
wizard = self.browse(cr, uid, ids)[0]
if wizard.limit_discount:
limit_discount = wizard.limit_discount
ir_values.set_default(cr, SUPERUSER_ID, 'sale.config.settings', 'limit_discount', limit_discount)
def get_default_module_sale_discount_approval(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
module_sale_discount_approval = ir_values.get_default(cr, uid, 'sale.config.settings',
'module_sale_discount_approval')
return {
'module_sale_discount_approval': module_sale_discount_approval == 'True',
}
def set_module_sale_discount_approval(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
wizard = self.browse(cr, uid, ids)[0]
if wizard.module_sale_discount_approval:
module_sale_discount_approval = 'True'
else:
module_sale_discount_approval = 'False'
ir_values.set_default(cr, SUPERUSER_ID, 'sale.config.settings', 'module_sale_discount_approval',
module_sale_discount_approval)
#######################################################sale order workflow##############################################################
class SaleInherit(osv.Model):
_inherit = 'sale.order'
_columns = {
'state': fields.selection([('draft', 'Draft Quotation'),
('sent', 'Quotation Sent'),
('cancel', 'Cancelled'),
('waiting_date', 'Waiting Schedule'),
('waitingapproval', 'Waiting Approval'),
('progress', 'Sales Order'),
('manual', 'Sale to Invoice'),
('shipping_except', 'Shipping Exception'),
('invoice_except', 'Invoice Exception'),
('done', 'Done')], required=True, track_visibility='onchange'),
}
def action_button_confirm(self, cr, uid, ids, context=None):
discnt = 0.0
no_line = 0.0
line_dicnt = 0.0
prod_price = 0.0
conf = self.pool.get('ir.values')
sale_obj = self.browse(cr, uid, ids, context)
double_valid = conf.get_default(cr, uid, 'sale.config.settings', 'module_sale_discount_approval')
if double_valid == 'True':
min_disct = conf.get_default(cr, uid, 'sale.config.settings', 'limit_discount')
for line in sale_obj.order_line:
no_line += 1
discnt += line.discount
discnt = (discnt / no_line)
if discnt >= min_disct:
assert len(ids) == 1, 'This option should only be used for a single id at a time.'
self.signal_workflow(cr, uid, ids, 'order_toapprov')
return True
else:
return super(SaleInherit, self).action_button_confirm(cr, uid, ids, context)
else:
return super(SaleInherit, self).action_button_confirm(cr, uid, ids, context)
####################################### workflow functions#############################################################################
@api.one
def wait_approval(self):
self.state = 'waitingapproval'
return True

2
sale_discount_total/report/__init__.py

@ -0,0 +1,2 @@
import sale_report
import invoice_report

22
sale_discount_total/report/invoice_report.py

@ -0,0 +1,22 @@
from openerp.osv import fields, osv
class DiscountInvoiceReport(osv.osv):
_inherit = 'account.invoice.report'
_columns = {
'discount': fields.float('Discount', readonly=True),
}
def _select(self):
res = super(DiscountInvoiceReport,self)._select()
select_str = res + """, sub.discount / cr.rate as discount """
return select_str
def _sub_select(self):
res = super(DiscountInvoiceReport,self)._sub_select()
select_str = res + """,SUM(CASE
WHEN ai.type::text = ANY (ARRAY['out_refund'::character varying::text, 'in_invoice'::character varying::text])
THEN - ((ail.quantity / u.factor * u2.factor) * ail.price_unit * (ail.discount) / 100.0)
ELSE ((ail.quantity / u.factor * u2.factor) * ail.price_unit * (ail.discount) / 100.0) END) as discount"""
return select_str

14
sale_discount_total/report/sale_report.py

@ -0,0 +1,14 @@
from openerp.osv import fields, osv
class DiscountSaleReport(osv.osv):
_inherit = 'sale.report'
_columns = {
'discount': fields.float('Discount', readonly=True),
}
def _select(self):
res = super(DiscountSaleReport,self)._select()
select_str = res+""",sum(l.product_uom_qty * cr.rate * l.price_unit * (l.discount) / 100.0) as discount"""
return select_str

BIN
sale_discount_total/static/description/Disc_appr_conf.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
sale_discount_total/static/description/Disc_appr_wrkfl.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
sale_discount_total/static/description/Discount_inv_amnt.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
sale_discount_total/static/description/Discount_so_perc.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

39
sale_discount_total/static/description/index.html

@ -0,0 +1,39 @@
<section class="oe_container">
<div class="oe_row">
<h2 class="oe_slogan">Discount On Sale</h2>
<!--<h3 class="oe_slogan">It Fits Your Sales Approach</h3>-->
<div>
<p>
This module allows you to mention discount on Total of sale order and Total of Customer Invoice in two ways
</p>
<hr>
<p>
1. As percentage<br>
Select 'Percentage' from Discount type and give discount percentage as Discount rate.
System will update the value of Discount and Total
</p>
<div class="oe_row_img oe_centered oe_mt32">
<img class="oe_picture oe_screenshot" src="Discount_so_perc.png">
</div>
<hr>
<p>
2. As amount<br>
Select 'Amount' from Discount type and give discount amount as Discount rate.
System will update the value of Discount and Total
</p>
<div class="oe_row_img oe_centered oe_mt32">
<img class="oe_picture oe_screenshot" src="Discount_inv_amnt.png">
</div>
<hr>
<p>
And the module also allows you to set a limit for total discount in percentage. Exceeding this limit
will require approval.
</p>
<div class="oe_row_img oe_centered oe_mt32">
<img class="oe_picture oe_screenshot" src="Disc_appr_conf.png"><hr>
<img class="oe_picture oe_screenshot" src="Disc_appr_wrkfl.png">
</div>
</div>
</div>
</section>

35
sale_discount_total/views/account_invoice_view.xml

@ -1,11 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record id="discount_view_invoice_line_tree" model="ir.ui.view">
<field name="name">discount.account.invoice.line.tree</field>
<field name="model">account.invoice.line</field>
<field name="inherit_id" ref="account.view_invoice_line_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='discount']" position="attributes">
<attribute name="digits">(16, 2)</attribute>
</xpath>
</field>
</record>
<record id="discount_view_invoice_line_form" model="ir.ui.view">
<field name="name">discount.account.invoice.line.form</field>
<field name="model">account.invoice.line</field>
<field name="inherit_id" ref="account.view_invoice_line_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='discount']" position="attributes">
<attribute name="digits">(16, 2)</attribute>
</xpath>
</field>
</record>
<record id="discount_account_invoice_view_form1" model="ir.ui.view">
<field name="name">discount.account.invoice</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='discount']" position="attributes">
<attribute name="digits">(16, 2)</attribute>
</xpath>
<xpath expr="//group[@class='oe_subtotal_footer oe_right']" position="replace">
<group col="4">
<group name="discount">
@ -14,14 +39,14 @@
</group>
<group class="oe_subtotal_footer oe_right">
<field name="amount_untaxed" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<div>
<label for="amount_tax"/>
<button name="button_reset_taxes" states="draft,proforma2"
<field name="amount_discount" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<div>
<label for="amount_tax"/>
<button name="button_reset_taxes" states="draft,proforma2"
string="(update)" class="oe_link oe_edit_only"
type="object" help="Recompute taxes and total"/>
</div>
</div>
<field name="amount_tax" nolabel="1" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="amount_discount" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<field name="amount_total" class="oe_subtotal_footer_separator" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="residual" groups="account.group_account_user" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="reconciled" invisible="1"/>

69
sale_discount_total/views/invoice_report.xml

@ -9,11 +9,9 @@
<th>Description</th>
<th>Quantity</th>
<th class="text-right">Unit Price</th>
<span t-foreach="o.invoice_line" t-as="l">
<span t-if="l.discount">
<th class="text-right" groups="sale.group_discount_per_so_line">Discount (%)</th>
</span>
</span>
<!--<span t-if="o.amount_discount">-->
<th class="text-right" groups="sale.group_discount_per_so_line">Discount (%)</th>
<!--</span>-->
<th class="text-right">Taxes</th>
<th class="text-right">Amount</th>
</tr>
@ -28,8 +26,11 @@
<td class="text-right">
<span t-field="l.price_unit"/>
</td>
<span t-if="l.discount"><td class="text-right" groups="sale.group_discount_per_so_line"><span t-field="l.discount"/></td></span>
<!--<span t-if="o.amount_discount">-->
<td class="text-right" groups="sale.group_discount_per_so_line">
<span t-field="l.discount"/>
</td>
<!--</span>-->
<td class="text-right">
<span t-esc="', '.join(map(lambda x: x.name, l.invoice_line_tax_id))"/>
</td>
@ -43,41 +44,41 @@
</xpath>
<xpath expr="//div[@class='col-xs-4 pull-right']/table/tr[2]" position="after">
<!--<t t-if="o.type=='out_invoice' or o.type=='out_refund'">-->
<t t-if="o.discount_rate">
<t t-if="o.type=='out_invoice' or o.type=='out_refund'">-->
<!--<t t-if="o.discount_rate">-->
<tr>
<td>Discount</td>
<td class="text-right">
<span t-field="o.amount_discount" t-field-options='{"widget": "monetary", "display_currency": "o.currency_id"}'/>
</td>
</tr>
</t>
<!--</t>-->
<!--</t>-->
</xpath>
<xpath expr="//div[@class='col-xs-4 pull-right']" position="before">
<t t-if="o.type=='out_invoice' or o.type=='out_refund'">
<div class="col-xs-4">
<t t-if="o.discount_rate">
<table class="table table-condensed">
<tr class="border-black">
<td>Discount Type</td>
<td class="text-right">
<span t-field="o.discount_type"/>
</td>
</tr>
<tr>
<td>Discount rate</td>
<td class="text-right">
<span t-field="o.discount_rate"/>
</td>
</tr>
<tr class="border-black"></tr>
</table>
</t>
</div>
</t>
</xpath>
<!--<xpath expr="//div[@class='col-xs-4 pull-right']" position="before">-->
<!--<t t-if="o.type=='out_invoice' or o.type=='out_refund'">-->
<!--<div class="col-xs-4">-->
<!--<t t-if="o.discount_rate">-->
<!--<table class="table table-condensed">-->
<!--<tr class="border-black">-->
<!--<td>Discount Type</td>-->
<!--<td class="text-right">-->
<!--<span t-field="o.discount_type"/>-->
<!--</td>-->
<!--</tr>-->
<!--<tr>-->
<!--<td>Discount rate</td>-->
<!--<td class="text-right">-->
<!--<span t-field="o.discount_rate"/>-->
<!--</td>-->
<!--</tr>-->
<!--<tr class="border-black"></tr>-->
<!--</table>-->
<!--</t>-->
<!--</div>-->
<!--</t>-->
<!--</xpath>-->
</template>
</data>
</openerp>
</openerp>

87
sale_discount_total/views/invoice_report.xml~

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="report_invoice_document" inherit_id="account.report_invoice_document">
<xpath expr="//table" position="replace">
<table class="table table-condensed">
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
<th class="text-right">Unit Price</th>
<!--<span t-foreach="o.invoice_line" t-as="l">-->
<!--<span t-if="l.discount">-->
<span t-if="o.amount_discount">
<th class="text-right" groups="sale.group_discount_per_so_line">Discount (%)</th>
</span>
<!--</span>-->
<th class="text-right">Taxes</th>
<th class="text-right">Amount</th>
</tr>
</thead>
<tbody class="invoice_tbody">
<tr t-foreach="o.invoice_line" t-as="l">
<td><span t-field="l.name"/></td>
<td>
<span t-field="l.quantity"/>
<span t-field="l.uos_id" groups="product.group_uom"/>
</td>
<td class="text-right">
<span t-field="l.price_unit"/>
</td>
<span t-if="o.amount_discount">
<td class="text-right" groups="sale.group_discount_per_so_line">
<span t-field="l.discount"/>
</td>
</span>
<td class="text-right">
<span t-esc="', '.join(map(lambda x: x.name, l.invoice_line_tax_id))"/>
</td>
<td class="text-right">
<span t-field="l.price_subtotal"
t-field-options='{"widget": "monetary", "display_currency": "o.currency_id"}'/>
</td>
</tr>
</tbody>
</table>
</xpath>
<xpath expr="//div[@class='col-xs-4 pull-right']/table/tr[2]" position="after">
<!--<t t-if="o.type=='out_invoice' or o.type=='out_refund'">-->
<t t-if="o.discount_rate">
<tr>
<td>Discount</td>
<td class="text-right">
<span t-field="o.amount_discount" t-field-options='{"widget": "monetary", "display_currency": "o.currency_id"}'/>
</td>
</tr>
</t>
<!--</t>-->
</xpath>
<!--<xpath expr="//div[@class='col-xs-4 pull-right']" position="before">-->
<!--<t t-if="o.type=='out_invoice' or o.type=='out_refund'">-->
<!--<div class="col-xs-4">-->
<!--<t t-if="o.discount_rate">-->
<!--<table class="table table-condensed">-->
<!--<tr class="border-black">-->
<!--<td>Discount Type</td>-->
<!--<td class="text-right">-->
<!--<span t-field="o.discount_type"/>-->
<!--</td>-->
<!--</tr>-->
<!--<tr>-->
<!--<td>Discount rate</td>-->
<!--<td class="text-right">-->
<!--<span t-field="o.discount_rate"/>-->
<!--</td>-->
<!--</tr>-->
<!--<tr class="border-black"></tr>-->
<!--</table>-->
<!--</t>-->
<!--</div>-->
<!--</t>-->
<!--</xpath>-->
</template>
</data>
</openerp>

28
sale_discount_total/views/sale_discount_approval_view.xml

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record id="view_double_sale_configuration" model="ir.ui.view">
<field name="name">Sale Application</field>
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="sale.view_sales_config"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='Sale Features']" position="inside">
<div>
<div name="module_sale_discount_approval">
<field name="module_sale_discount_approval" class="oe_inline"/>
<label for="module_sale_discount_approval"/>
<span class="oe_separate-from-text">
<label for="limit_discount"/>
<field name="limit_discount" attrs="{'required': [('module_sale_discount_approval','=',True)]}" class="oe_inline"/>
</span>
</div>
</div>
</xpath>
</field>
</record>
</data>
</openerp>

133
sale_discount_total/views/sale_discount_approval_workflow.xml

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="sale_inherit_wkfform_view" model="ir.ui.view">
<field name="name">sale.order.workflow.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<!-- Statusbar widget should also contain the new status -->
<field name="state" position="replace">
<field name="state" widget="statusbar" statusbar_visible="draft,sent,progress,done" statusbar_colors='{"invoice_except":"red","waiting_date":"blue"}'/>
</field>
<field name="state" position="before">
<!-- buttonz -->
<button string="Approve Order" type="workflow" name="order_confirm" states="waitingapproval" class="oe_highlight" groups="base.group_sale_manager"/>
</field>
<xpath expr="//button[@name='action_cancel']" position="attributes">
<attribute name ="states">waitingapproval,manual,progress</attribute>
</xpath>
<xpath expr="//button[@name='action_cancel']" position="attributes">
<attribute name ="states">waitingapproval,manual,progress</attribute>
</xpath>
</field>
</record>
<!--activity-->
<record id="act_approve" model="workflow.activity">
<field name="wkf_id" ref="sale.wkf_sale"/>
<field name="name">Waiting Approval</field>
<field name="kind">function</field>
<field name="action">wait_approval()</field>
</record>
<!--end of activity-->
<!--transitions-->
<record model="workflow.transition" id="sale.trans_draft_router">
<field name="act_from" ref="sale.act_draft"/>
<field name="act_to" ref="act_approve"/>
<field name="signal">order_toapprov</field>
</record>
<record id="sale_trans_draft_router" model="workflow.transition">
<field name="act_from" ref="sale.act_draft"/>
<field name="act_to" ref="sale.act_router"/>
<field name="signal">order_confirm</field>
</record>
<record id="sale_trans_approvd" model="workflow.transition">
<field name="act_from" ref="act_approve"/>
<field name="act_to" ref="sale.act_router"/>
<field name="signal">order_confirm</field>
</record>
<!--end of transition-->
<!--sale transition inherit-->
<record id="sale.trans_draft_sent" model="workflow.transition">
<field name="act_from" ref="sale.act_draft"/>
<field name="act_to" ref="sale.act_sent"/>
<field name="signal">quotation_sent</field>
</record>
<record id="sale.trans_draft_cancel" model="workflow.transition">
<field name="act_from" ref="sale.act_draft"/>
<field name="act_to" ref="sale.act_cancel"/>
<field name="signal">cancel</field>
</record>
<record id="sale.trans_sent_router" model="workflow.transition">
<field name="act_from" ref="sale.act_sent"/>
<field name="act_to" ref="sale.act_router"/>
<field name="signal">order_confirm</field>
</record>
<record id="sale.trans_sent_cancel" model="workflow.transition">
<field name="act_from" ref="sale.act_sent"/>
<field name="act_to" ref="sale.act_cancel"/>
<field name="signal">cancel</field>
</record>
<record id="sale.trans_router_wait_invoice" model="workflow.transition">
<field name="act_from" ref="sale.act_router"/>
<field name="act_to" ref="sale.act_wait_invoice"/>
</record>
<record id="sale.trans_wait_invoice_all_lines_invoiced" model="workflow.transition">
<field name="act_from" ref="sale.act_wait_invoice"/>
<field name="act_to" ref="sale.act_invoice_end"/>
<field name="signal">all_lines</field>
</record>
<record id="sale.trans_wait_invoice_cancel2" model="workflow.transition">
<field name="act_from" ref="sale.act_wait_invoice"/>
<field name="act_to" ref="sale.act_cancel2"/>
<field name="signal">cancel</field>
</record>
<record id="sale.trans_wait_invoice_invoice_manual" model="workflow.transition">
<field name="act_from" ref="sale.act_wait_invoice"/>
<field name="act_to" ref="sale.act_invoice"/>
<field name="signal">manual_invoice</field>
</record>
<record id="sale.trans_invoice_invoice_end" model="workflow.transition">
<field name="act_from" ref="sale.act_invoice"/>
<field name="act_to" ref="sale.act_invoice_end"/>
<field name="signal">subflow.paid</field>
</record>
<record id="sale.trans_invoice_invoice_except" model="workflow.transition">
<field name="act_from" ref="sale.act_invoice"/>
<field name="act_to" ref="sale.act_invoice_except"/>
<field name="signal">subflow.cancel</field>
</record>
<record id="sale.trans_invoice_except_invoice" model="workflow.transition">
<field name="act_from" ref="sale.act_invoice_except"/>
<field name="act_to" ref="sale.act_invoice"/>
<field name="signal">invoice_recreate</field>
</record>
<record id="sale.trans_invoice_except_invoice_end" model="workflow.transition">
<field name="act_from" ref="sale.act_invoice_except"/>
<field name="act_to" ref="sale.act_invoice_end"/>
<field name="signal">invoice_corrected</field>
</record>
<record id="sale.trans_invoice_except_invoice_cancel" model="workflow.transition">
<field name="act_from" ref="sale.act_invoice_except"/>
<field name="act_to" ref="sale.act_invoice_cancel"/>
<field name="signal">invoice_cancel</field>
</record>
<record id="sale.trans_invoice_end_done" model="workflow.transition">
<field name="act_from" ref="sale.act_invoice_end"/>
<field name="act_to" ref="sale.act_done"/>
</record>
<!--end of sale transitions-->
</data>
</openerp>

48
sale_discount_total/views/sale_order_report.xml

@ -4,37 +4,37 @@
<template id="report_sale_order_document" inherit_id="sale.report_saleorder_document">
<xpath expr="//div[@class='col-xs-4 pull-right']/table/tr[2]" position="after">
<t t-if="o.discount_rate">
<!--<t t-if="o.discount_rate">-->
<tr>
<td>Discount</td>
<td class="text-right">
<span t-field="o.amount_discount" t-field-options='{"widget": "monetary", "display_currency": "o.currency_id"}'/>
</td>
</tr>
</t>
<!--</t>-->
</xpath>
<xpath expr="//div[@class='col-xs-4 pull-right']" position="before">
<div class="col-xs-4">
<t t-if="o.discount_rate">
<table class="table table-condensed">
<tr class="border-black">
<td>Discount Type</td>
<td class="text-right">
<span t-field="o.discount_type"/>
</td>
</tr>
<tr>
<td>Discount Rate</td>
<td class="text-right">
<span t-field="o.discount_rate"/>
</td>
</tr>
<tr class="border-black"></tr>
</table>
</t>
</div>
</xpath>
<!--<xpath expr="//div[@class='col-xs-4 pull-right']" position="before">-->
<!--<div class="col-xs-4">-->
<!--<t t-if="o.discount_rate">-->
<!--<table class="table table-condensed">-->
<!--<tr class="border-black">-->
<!--<td>Discount Type</td>-->
<!--<td class="text-right">-->
<!--<span t-field="o.discount_type"/>-->
<!--</td>-->
<!--</tr>-->
<!--<tr>-->
<!--<td>Discount Rate</td>-->
<!--<td class="text-right">-->
<!--<span t-field="o.discount_rate"/>-->
<!--</td>-->
<!--</tr>-->
<!--<tr class="border-black"></tr>-->
<!--</table>-->
<!--</t>-->
<!--</div>-->
<!--</xpath>-->
</template>
</data>
</openerp>
</openerp>

40
sale_discount_total/views/sale_order_report.xml~

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="report_sale_order_document" inherit_id="sale.report_saleorder_document">
<xpath expr="//div[@class='col-xs-4 pull-right']/table/tr[2]" position="after">
<t t-if="o.discount_rate">
<tr>
<td>Discount</td>
<td class="text-right">
<span t-field="o.amount_discount" t-field-options='{"widget": "monetary", "display_currency": "o.currency_id"}'/>
</td>
</tr>
</t>
</xpath>
<!--<xpath expr="//div[@class='col-xs-4 pull-right']" position="before">-->
<!--<div class="col-xs-4">-->
<!--<t t-if="o.discount_rate">-->
<!--<table class="table table-condensed">-->
<!--<tr class="border-black">-->
<!--<td>Discount Type</td>-->
<!--<td class="text-right">-->
<!--<span t-field="o.discount_type"/>-->
<!--</td>-->
<!--</tr>-->
<!--<tr>-->
<!--<td>Discount Rate</td>-->
<!--<td class="text-right">-->
<!--<span t-field="o.discount_rate"/>-->
<!--</td>-->
<!--</tr>-->
<!--<tr class="border-black"></tr>-->
<!--</table>-->
<!--</t>-->
<!--</div>-->
<!--</xpath>-->
</template>
</data>
</openerp>

4
sale_discount_total/views/sale_view.xml

@ -8,14 +8,14 @@
<field name="arch" type="xml">
<xpath expr="//group[@name='sale_total']" position="replace">
<group col="4">
<group name="discount">
<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_tax" 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"

1
salon_operation/__init__.py

@ -0,0 +1 @@
import models,sweep

41
salon_operation/__openerp__.py

@ -0,0 +1,41 @@
{
'name': 'Salon Booking',
'summary': """ """,
'description': """ """,
'author': 'Cybrosys Techno Solutions',
'website': 'http://www.cybrosys.com',
'category': 'Test',
'version': '0.1',
'depends': ['base',
'sale',
'hr',
],
'data': [
'templates/template.xml',
'security/ir.model.access.csv',
'views/chair_view.xml',
'views/period_view.xml',
'views/day_view.xml',
'views/month_view.xml',
'views/autofill_month.xml',
'views/salon_book_view.xml',
'sweep/sweep_sale_order.xml',
'sweep/sweep_menu_act.xml',
'sweep/sweep_product.xml',
'sweep/sweep_invoice.xml',
],
'demo': ['demo/demo_chair.xml',
'demo/demo_time.xml',
'demo/demo_day.xml',
'demo/demo_month.xml',
],
'installable': True,
'auto_install': False,
'application': True,
}

28
salon_operation/demo/demo_chair.xml

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="chair_0001" model="salon.chair">
<field name="name">CH0001</field>
<field name="related_employee" ref="hr.employee_fp"/>
</record>
<record id="chair_0002" model="salon.chair">
<field name="name">CH0002</field>
<field name="related_employee" ref="hr.employee_al"/>
</record>
<record id="chair_0003" model="salon.chair">
<field name="name">CH0003</field>
<field name="related_employee" ref="hr.employee_mit"/>
</record>
<record id="chair_0004" model="salon.chair">
<field name="name">CH0004</field>
<field name="related_employee" ref="hr.employee_niv"/>
</record>
</data>
</openerp>

911
salon_operation/demo/demo_day.xml

@ -0,0 +1,911 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- 1 -->
<!--<record id="day_0001" model="salon.day">-->
<!--<field name="name">01</field>-->
<!--</record>-->
<!--<record id="day_line_0001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_0001"/>-->
<!--</record>-->
<!--<record id="day_line_0002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_0001"/>-->
<!--</record>-->
<!--<record id="day_line_0003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_0001"/>-->
<!--</record>-->
<!--<record id="day_line_0004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_0001"/>-->
<!--</record>-->
<!--<record id="day_line_0005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_0001"/>-->
<!--</record>-->
<!--&lt;!&ndash; 2 &ndash;&gt;-->
<!--<record id="day_0002" model="salon.day">-->
<!--<field name="name">02</field>-->
<!--</record>-->
<!--<record id="day_line_e10001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_0002"/>-->
<!--</record>-->
<!--<record id="day_line_e10002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_0002"/>-->
<!--</record>-->
<!--<record id="day_line_e10003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_0002"/>-->
<!--</record>-->
<!--<record id="day_line_e10004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_0002"/>-->
<!--</record>-->
<!--<record id="day_line_e10005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_0002"/>-->
<!--</record>-->
<!--&lt;!&ndash; 3 &ndash;&gt;-->
<!--<record id="day_0003" model="salon.day">-->
<!--<field name="name">03</field>-->
<!--</record>-->
<!--<record id="day_line_n110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_0003"/>-->
<!--</record>-->
<!--<record id="day_line_n110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_0003"/>-->
<!--</record>-->
<!--<record id="day_line_n110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_0003"/>-->
<!--</record>-->
<!--<record id="day_line_n110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_0003"/>-->
<!--</record>-->
<!--<record id="day_line_n110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_0003"/>-->
<!--</record>-->
<!--&lt;!&ndash; 4 &ndash;&gt;-->
<!--<record id="day_0004" model="salon.day">-->
<!--<field name="name">04</field>-->
<!--</record>-->
<!--<record id="day_line_ks1110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_0004"/>-->
<!--</record>-->
<!--<record id="day_line_ks1110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_0004"/>-->
<!--</record>-->
<!--<record id="day_line_ks1110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_0004"/>-->
<!--</record>-->
<!--<record id="day_line_ks1110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_0004"/>-->
<!--</record>-->
<!--<record id="day_line_ks1110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_0004"/>-->
<!--</record>-->
<!--&lt;!&ndash; 5 &ndash;&gt;-->
<!--<record id="day_0005" model="salon.day">-->
<!--<field name="name">05</field>-->
<!--</record>-->
<!--<record id="day_line_x111110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_0005"/>-->
<!--</record>-->
<!--<record id="day_line_x111110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_0005"/>-->
<!--</record>-->
<!--<record id="day_line_x111110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_0005"/>-->
<!--</record>-->
<!--<record id="day_line_x111110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_0005"/>-->
<!--</record>-->
<!--<record id="day_line_x111110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_0005"/>-->
<!--</record>-->
<!--&lt;!&ndash; 6 &ndash;&gt;-->
<!--<record id="day_0006" model="salon.day">-->
<!--<field name="name">06</field>-->
<!--</record>-->
<!--<record id="day_line_211110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_0006"/>-->
<!--</record>-->
<!--<record id="day_line_211110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_0006"/>-->
<!--</record>-->
<!--<record id="day_line_211110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_0006"/>-->
<!--</record>-->
<!--<record id="day_line_211110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_0006"/>-->
<!--</record>-->
<!--<record id="day_line_211110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_0006"/>-->
<!--</record>-->
<!--&lt;!&ndash; 7 &ndash;&gt;-->
<!--<record id="day_0007" model="salon.day">-->
<!--<field name="name">07</field>-->
<!--</record>-->
<!--<record id="day_line_40001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_0007"/>-->
<!--</record>-->
<!--<record id="day_line_40002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_0007"/>-->
<!--</record>-->
<!--<record id="day_line_40003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_0007"/>-->
<!--</record>-->
<!--<record id="day_line_40004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_0007"/>-->
<!--</record>-->
<!--<record id="day_line_40005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_0007"/>-->
<!--</record>-->
<!--&lt;!&ndash; 8 &ndash;&gt;-->
<!--<record id="day_0008" model="salon.day">-->
<!--<field name="name">08</field>-->
<!--</record>-->
<!--<record id="day_line_440001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_0008"/>-->
<!--</record>-->
<!--<record id="day_line_440002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_0008"/>-->
<!--</record>-->
<!--<record id="day_line_440003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_0008"/>-->
<!--</record>-->
<!--<record id="day_line_440004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_0008"/>-->
<!--</record>-->
<!--<record id="day_line_440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_0008"/>-->
<!--</record>-->
<!--&lt;!&ndash; 9 &ndash;&gt;-->
<!--<record id="day_0009" model="salon.day">-->
<!--<field name="name">09</field>-->
<!--</record>-->
<!--<record id="day_line_4440001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_0009"/>-->
<!--</record>-->
<!--<record id="day_line_4440002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_0009"/>-->
<!--</record>-->
<!--<record id="day_line_4440003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_0009"/>-->
<!--</record>-->
<!--<record id="day_line_4440004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_0009"/>-->
<!--</record>-->
<!--<record id="day_line_4440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_0009"/>-->
<!--</record>-->
<!--&lt;!&ndash; 10 &ndash;&gt;-->
<!--<record id="day_00010" model="salon.day">-->
<!--<field name="name">10</field>-->
<!--</record>-->
<!--<record id="day_line_44440001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00010"/>-->
<!--</record>-->
<!--<record id="day_line_44440002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00010"/>-->
<!--</record>-->
<!--<record id="day_line_44440003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00010"/>-->
<!--</record>-->
<!--<record id="day_line_44440004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00010"/>-->
<!--</record>-->
<!--<record id="day_line_44440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00010"/>-->
<!--</record>-->
<!--&lt;!&ndash;========================================================================================================&ndash;&gt;-->
<!--&lt;!&ndash; 1 &ndash;&gt;-->
<!--<record id="day_00011" model="salon.day">-->
<!--<field name="name">11</field>-->
<!--</record>-->
<!--<record id="day_line_10001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00011"/>-->
<!--</record>-->
<!--<record id="day_line_10002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00011"/>-->
<!--</record>-->
<!--<record id="day_line_10003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00011"/>-->
<!--</record>-->
<!--<record id="day_line_10004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00011"/>-->
<!--</record>-->
<!--<record id="day_line_10005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00011"/>-->
<!--</record>-->
<!--&lt;!&ndash; 2 &ndash;&gt;-->
<!--<record id="day_00012" model="salon.day">-->
<!--<field name="name">12</field>-->
<!--</record>-->
<!--<record id="day_line_110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00012"/>-->
<!--</record>-->
<!--<record id="day_line_110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00012"/>-->
<!--</record>-->
<!--<record id="day_line_110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00012"/>-->
<!--</record>-->
<!--<record id="day_line_110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00012"/>-->
<!--</record>-->
<!--<record id="day_line_110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00012"/>-->
<!--</record>-->
<!--&lt;!&ndash; 3 &ndash;&gt;-->
<!--<record id="day_00013" model="salon.day">-->
<!--<field name="name">13</field>-->
<!--</record>-->
<!--<record id="day_line_1110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00013"/>-->
<!--</record>-->
<!--<record id="day_line_1110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00013"/>-->
<!--</record>-->
<!--<record id="day_line_1110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00013"/>-->
<!--</record>-->
<!--<record id="day_line_1110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00013"/>-->
<!--</record>-->
<!--<record id="day_line_1110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00013"/>-->
<!--</record>-->
<!--&lt;!&ndash; 4 &ndash;&gt;-->
<!--<record id="day_00014" model="salon.day">-->
<!--<field name="name">14</field>-->
<!--</record>-->
<!--<record id="day_line_11110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00014"/>-->
<!--</record>-->
<!--<record id="day_line_11110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00014"/>-->
<!--</record>-->
<!--<record id="day_line_11110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00014"/>-->
<!--</record>-->
<!--<record id="day_line_11110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00014"/>-->
<!--</record>-->
<!--<record id="day_line_11110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00014"/>-->
<!--</record>-->
<!--&lt;!&ndash; 5 &ndash;&gt;-->
<!--<record id="day_00015" model="salon.day">-->
<!--<field name="name">15</field>-->
<!--</record>-->
<!--<record id="day_line_111110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00015"/>-->
<!--</record>-->
<!--<record id="day_line_111110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00015"/>-->
<!--</record>-->
<!--<record id="day_line_111110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00015"/>-->
<!--</record>-->
<!--<record id="day_line_111110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00015"/>-->
<!--</record>-->
<!--<record id="day_line_111110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00015"/>-->
<!--</record>-->
<!--&lt;!&ndash; 6 &ndash;&gt;-->
<!--<record id="day_00016" model="salon.day">-->
<!--<field name="name">16</field>-->
<!--</record>-->
<!--<record id="day_line_2111110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00016"/>-->
<!--</record>-->
<!--<record id="day_line_2111110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00016"/>-->
<!--</record>-->
<!--<record id="day_line_2111110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00016"/>-->
<!--</record>-->
<!--<record id="day_line_2111110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00016"/>-->
<!--</record>-->
<!--<record id="day_line_2111110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00016"/>-->
<!--</record>-->
<!--&lt;!&ndash; 7 &ndash;&gt;-->
<!--<record id="day_00017" model="salon.day">-->
<!--<field name="name">17</field>-->
<!--</record>-->
<!--<record id="day_line_400101" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00017"/>-->
<!--</record>-->
<!--<record id="day_line_401002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00017"/>-->
<!--</record>-->
<!--<record id="day_line_400103" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00017"/>-->
<!--</record>-->
<!--<record id="day_line_401004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00017"/>-->
<!--</record>-->
<!--<record id="day_line_400105" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00017"/>-->
<!--</record>-->
<!--&lt;!&ndash; 8 &ndash;&gt;-->
<!--<record id="day_00018" model="salon.day">-->
<!--<field name="name">18</field>-->
<!--</record>-->
<!--<record id="day_line_1440001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00018"/>-->
<!--</record>-->
<!--<record id="day_line_1440002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00018"/>-->
<!--</record>-->
<!--<record id="day_line_1440003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00018"/>-->
<!--</record>-->
<!--<record id="day_line_1440004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00018"/>-->
<!--</record>-->
<!--<record id="day_line_1440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00018"/>-->
<!--</record>-->
<!--&lt;!&ndash; 9 &ndash;&gt;-->
<!--<record id="day_00019" model="salon.day">-->
<!--<field name="name">19</field>-->
<!--</record>-->
<!--<record id="day_line_14440001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00019"/>-->
<!--</record>-->
<!--<record id="day_line_14440002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00019"/>-->
<!--</record>-->
<!--<record id="day_line_14440003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00019"/>-->
<!--</record>-->
<!--<record id="day_line_14440004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00019"/>-->
<!--</record>-->
<!--<record id="day_line_14440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00019"/>-->
<!--</record>-->
<!--&lt;!&ndash; 10 &ndash;&gt;-->
<!--<record id="day_00020" model="salon.day">-->
<!--<field name="name">20</field>-->
<!--</record>-->
<!--<record id="day_line_144440001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00020"/>-->
<!--</record>-->
<!--<record id="day_line_144440002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00020"/>-->
<!--</record>-->
<!--<record id="day_line_144440003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00020"/>-->
<!--</record>-->
<!--<record id="day_line_144440004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00020"/>-->
<!--</record>-->
<!--<record id="day_line_144440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00020"/>-->
<!--</record>-->
<!--&lt;!&ndash;===========================================================================&ndash;&gt;-->
<!--&lt;!&ndash;=========================================================================&ndash;&gt;-->
<!--&lt;!&ndash; 1 &ndash;&gt;-->
<!--<record id="day_00021" model="salon.day">-->
<!--<field name="name">21</field>-->
<!--</record>-->
<!--<record id="day_line_w0001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00021"/>-->
<!--</record>-->
<!--<record id="day_line_w0002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00021"/>-->
<!--</record>-->
<!--<record id="day_line_w0003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00021"/>-->
<!--</record>-->
<!--<record id="day_line_w0004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00021"/>-->
<!--</record>-->
<!--<record id="day_line_w0005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00021"/>-->
<!--</record>-->
<!--&lt;!&ndash; 2 &ndash;&gt;-->
<!--<record id="day_00022" model="salon.day">-->
<!--<field name="name">22</field>-->
<!--</record>-->
<!--<record id="day_line_e1w0001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00022"/>-->
<!--</record>-->
<!--<record id="day_line_e10w002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00022"/>-->
<!--</record>-->
<!--<record id="day_line_e100w03" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00022"/>-->
<!--</record>-->
<!--<record id="day_line_e1w0004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00022"/>-->
<!--</record>-->
<!--<record id="day_line_e1w0005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00022"/>-->
<!--</record>-->
<!--&lt;!&ndash; 3 &ndash;&gt;-->
<!--<record id="day_00023" model="salon.day">-->
<!--<field name="name">23</field>-->
<!--</record>-->
<!--<record id="day_line_n11w0001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00023"/>-->
<!--</record>-->
<!--<record id="day_line_n11w0002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00023"/>-->
<!--</record>-->
<!--<record id="day_line_n11w0003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00023"/>-->
<!--</record>-->
<!--<record id="day_line_n11w0004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00023"/>-->
<!--</record>-->
<!--<record id="day_line_n1w10005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00023"/>-->
<!--</record>-->
<!--&lt;!&ndash; 4 &ndash;&gt;-->
<!--<record id="day_00024" model="salon.day">-->
<!--<field name="name">24</field>-->
<!--</record>-->
<!--<record id="day_line_sw1110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00024"/>-->
<!--</record>-->
<!--<record id="day_line_sw1110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00024"/>-->
<!--</record>-->
<!--<record id="day_line_s1110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00024"/>-->
<!--</record>-->
<!--<record id="day_line_s1w110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00024"/>-->
<!--</record>-->
<!--<record id="day_line_sw1110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00024"/>-->
<!--</record>-->
<!--&lt;!&ndash; 5 &ndash;&gt;-->
<!--<record id="day_00025" model="salon.day">-->
<!--<field name="name">25</field>-->
<!--</record>-->
<!--<record id="day_line_x1w11110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00025"/>-->
<!--</record>-->
<!--<record id="day_line_x1w11110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00025"/>-->
<!--</record>-->
<!--<record id="day_line_x11w1110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00025"/>-->
<!--</record>-->
<!--<record id="day_line_x1w11110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00025"/>-->
<!--</record>-->
<!--<record id="day_line_x1w11110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00025"/>-->
<!--</record>-->
<!--&lt;!&ndash; 6 &ndash;&gt;-->
<!--<record id="day_00026" model="salon.day">-->
<!--<field name="name">26</field>-->
<!--</record>-->
<!--<record id="day_line_21w1110001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00026"/>-->
<!--</record>-->
<!--<record id="day_line_2w11110002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00026"/>-->
<!--</record>-->
<!--<record id="day_line_21w1110003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00026"/>-->
<!--</record>-->
<!--<record id="day_line_211w110004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00026"/>-->
<!--</record>-->
<!--<record id="day_line_2w11110005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00026"/>-->
<!--</record>-->
<!--&lt;!&ndash; 7 &ndash;&gt;-->
<!--<record id="day_00027" model="salon.day">-->
<!--<field name="name">27</field>-->
<!--</record>-->
<!--<record id="day_line_w40001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00027"/>-->
<!--</record>-->
<!--<record id="day_line_w40002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00027"/>-->
<!--</record>-->
<!--<record id="day_line_w40003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00027"/>-->
<!--</record>-->
<!--<record id="day_line_w40004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00027"/>-->
<!--</record>-->
<!--<record id="day_line_w40005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00027"/>-->
<!--</record>-->
<!--&lt;!&ndash; 8 &ndash;&gt;-->
<!--<record id="day_00028" model="salon.day">-->
<!--<field name="name">28</field>-->
<!--</record>-->
<!--<record id="day_line_4w40001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00028"/>-->
<!--</record>-->
<!--<record id="day_line_4w40002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00028"/>-->
<!--</record>-->
<!--<record id="day_line_4w40003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00028"/>-->
<!--</record>-->
<!--<record id="day_line_4w40004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00028"/>-->
<!--</record>-->
<!--<record id="day_line_w440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00028"/>-->
<!--</record>-->
<!--&lt;!&ndash; 9 &ndash;&gt;-->
<!--<record id="day_00029" model="salon.day">-->
<!--<field name="name">29</field>-->
<!--</record>-->
<!--<record id="day_line_q44w40001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00029"/>-->
<!--</record>-->
<!--<record id="day_line_q444w0002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00029"/>-->
<!--</record>-->
<!--<record id="day_line_q44w40003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00029"/>-->
<!--</record>-->
<!--<record id="day_line_q44w40004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00029"/>-->
<!--</record>-->
<!--<record id="day_line_q4w440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00029"/>-->
<!--</record>-->
<!--&lt;!&ndash; 10 &ndash;&gt;-->
<!--<record id="day_00030" model="salon.day">-->
<!--<field name="name">30</field>-->
<!--</record>-->
<!--<record id="day_line_44w440001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00030"/>-->
<!--</record>-->
<!--<record id="day_line_44w440002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00030"/>-->
<!--</record>-->
<!--<record id="day_line_44w440003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00030"/>-->
<!--</record>-->
<!--<record id="day_line_444w40004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00030"/>-->
<!--</record>-->
<!--<record id="day_line_44w440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00030"/>-->
<!--</record>-->
<!--&lt;!&ndash;==========================================================================&ndash;&gt;-->
<!--&lt;!&ndash; 31 &ndash;&gt;-->
<!--<record id="day_00031" model="salon.day">-->
<!--<field name="name">31</field>-->
<!--</record>-->
<!--<record id="day_line_p44w440001" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--<field name="day_id" ref="day_00031"/>-->
<!--</record>-->
<!--<record id="day_line_p44w440002" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--<field name="day_id" ref="day_00031"/>-->
<!--</record>-->
<!--<record id="day_line_p44w440003" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--<field name="day_id" ref="day_00031"/>-->
<!--</record>-->
<!--<record id="day_line_p444w40004" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--<field name="day_id" ref="day_00031"/>-->
<!--</record>-->
<!--<record id="day_line_p44w440005" model="salon.day.line">-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--<field name="day_id" ref="day_00031"/>-->
<!--</record>-->
</data>
</openerp>

166
salon_operation/demo/demo_month.xml

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--<record id="month_0001" model="salon.month">-->
<!--<field name="name">Dec 2016</field>-->
<!--<field name="month">01</field>-->
<!--<field name="year">2016</field>-->
<!--</record>-->
<!--<record id="month_line_0001" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_0001"/>-->
<!--</record>-->
<!--<record id="month_line_0002" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_0002"/>-->
<!--</record>-->
<!--<record id="month_line_0003" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_0003"/>-->
<!--</record>-->
<!--<record id="month_line_0004" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_0004"/>-->
<!--</record>-->
<!--<record id="month_line_0005" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_0005"/>-->
<!--</record>-->
<!--<record id="month_line_0006" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_0006"/>-->
<!--</record>-->
<!--<record id="month_line_0007" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_0007"/>-->
<!--</record>-->
<!--<record id="month_line_0008" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_0008"/>-->
<!--</record>-->
<!--<record id="month_line_0009" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_0009"/>-->
<!--</record>-->
<!--<record id="month_line_00010" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00010"/>-->
<!--</record>-->
<!--&lt;!&ndash; =================================================================== &ndash;&gt;-->
<!--<record id="month_line_00011" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00011"/>-->
<!--</record>-->
<!--<record id="month_line_00012" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00012"/>-->
<!--</record>-->
<!--<record id="month_line_00013" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00013"/>-->
<!--</record>-->
<!--<record id="month_line_00014" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00014"/>-->
<!--</record>-->
<!--<record id="month_line_00015" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00015"/>-->
<!--</record>-->
<!--<record id="month_line_00016" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00016"/>-->
<!--</record>-->
<!--<record id="month_line_00017" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00017"/>-->
<!--</record>-->
<!--<record id="month_line_00018" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00018"/>-->
<!--</record>-->
<!--<record id="month_line_00019" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00019"/>-->
<!--</record>-->
<!--<record id="month_line_00020" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00020"/>-->
<!--</record>-->
<!--&lt;!&ndash; ===========================================================&ndash;&gt;-->
<!--<record id="month_line_000211" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00021"/>-->
<!--</record>-->
<!--<record id="month_line_000212" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00022"/>-->
<!--</record>-->
<!--<record id="month_line_000213" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00023"/>-->
<!--</record>-->
<!--<record id="month_line_000214" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00024"/>-->
<!--</record>-->
<!--<record id="month_line_000215" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00025"/>-->
<!--</record>-->
<!--<record id="month_line_000216" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00026"/>-->
<!--</record>-->
<!--<record id="month_line_000217" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00027"/>-->
<!--</record>-->
<!--<record id="month_line_000218" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00028"/>-->
<!--</record>-->
<!--<record id="month_line_000219" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00029"/>-->
<!--</record>-->
<!--<record id="month_line_000220" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00030"/>-->
<!--</record>-->
<!--&lt;!&ndash;===========================================================&ndash;&gt;-->
<!--<record id="month_line_000220_31" model="salon.month.line">-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--<field name="days" ref="day_00031"/>-->
<!--</record>-->
</data>
</openerp>

473
salon_operation/demo/demo_time.xml

@ -0,0 +1,473 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--<record id="month_0001" model="salon.month">-->
<!--<field name="name">Jan 2016</field>-->
<!--<field name="month">01</field>-->
<!--<field name="year">2016</field>-->
<!--</record>-->
<!--&lt;!&ndash;day 01&ndash;&gt;-->
<!--<record id="day_000_cc1" model="salon.day">-->
<!--<field name="name">01</field>-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--</record>-->
<!--&lt;!&ndash; 09.30 &ndash;&gt;-->
<!--<record id="time_00001" model="salon.period">-->
<!--<field name="name">09.30</field>-->
<!--<field name="day_id" ref="day_000_cc1"/>-->
<!--</record>-->
<!--<record id="time_line_00001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--</record>-->
<!--<record id="time_line_00002" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--</record>-->
<!--<record id="time_line_00003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--</record>-->
<!--<record id="time_line_00004" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_00001"/>-->
<!--</record>-->
<!--&lt;!&ndash; 11:00 &ndash;&gt;-->
<!--<record id="time_00002" model="salon.period">-->
<!--<field name="name">11.00</field>-->
<!--<field name="day_id" ref="day_000_cc1"/>-->
<!--</record>-->
<!--<record id="time_line_100001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--</record>-->
<!--<record id="time_line_100002" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--</record>-->
<!--<record id="time_line_100003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--</record>-->
<!--<record id="time_line_100004" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_00002"/>-->
<!--</record>-->
<!--&lt;!&ndash; 13:00 &ndash;&gt;-->
<!--<record id="time_00003" model="salon.period">-->
<!--<field name="name">13.00</field>-->
<!--<field name="period_type">off</field>-->
<!--<field name="off_reason">Lunch Break</field>-->
<!--<field name="day_id" ref="day_000_cc1"/>-->
<!--</record>-->
<!--<record id="time_line_1100001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--</record>-->
<!--<record id="time_line_1100002" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--</record>-->
<!--<record id="time_line_1100003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--</record>-->
<!--<record id="time_line_1100004" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_00003"/>-->
<!--</record>-->
<!--&lt;!&ndash; 15:00 &ndash;&gt;-->
<!--<record id="time_00004" model="salon.period">-->
<!--<field name="name">15.00</field>-->
<!--<field name="day_id" ref="day_000_cc1"/>-->
<!--</record>-->
<!--<record id="time_line_11100x001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--</record>-->
<!--<record id="time_line_11s100002" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--</record>-->
<!--<record id="time_line_1d1100003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--</record>-->
<!--<record id="time_line_11100004" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_00004"/>-->
<!--</record>-->
<!--&lt;!&ndash; 19:00&ndash;&gt;-->
<!--<record id="time_00005" model="salon.period">-->
<!--<field name="name">19.00</field>-->
<!--<field name="day_id" ref="day_000_cc1"/>-->
<!--</record>-->
<!--<record id="time_line_111100001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--</record>-->
<!--<record id="time_line_111100002" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--</record>-->
<!--<record id="time_line_111100003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--</record>-->
<!--<record id="time_line_111100004" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_00005"/>-->
<!--</record>-->
<!--&lt;!&ndash;===================================================================================&ndash;&gt;-->
<!--&lt;!&ndash;day 02&ndash;&gt;-->
<!--<record id="day_000_cc2" model="salon.day">-->
<!--<field name="name">02</field>-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--</record>-->
<!--<record id="time_000011" model="salon.period">-->
<!--<field name="name">09.30</field>-->
<!--<field name="day_id" ref="day_000_cc2"/>-->
<!--</record>-->
<!--<record id="time_line_1000011" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000011"/>-->
<!--</record>-->
<!--<record id="time_line_1000021" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000011"/>-->
<!--</record>-->
<!--<record id="time_line_1000031" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000011"/>-->
<!--</record>-->
<!--<record id="time_line_1000041" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000011"/>-->
<!--</record>-->
<!--&lt;!&ndash; 11:00 &ndash;&gt;-->
<!--<record id="time_000021" model="salon.period">-->
<!--<field name="name">11.00</field>-->
<!--<field name="day_id" ref="day_000_cc2"/>-->
<!--</record>-->
<!--<record id="time_line_hf1000011" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000021"/>-->
<!--</record>-->
<!--<record id="time_line_1xs000021" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000021"/>-->
<!--</record>-->
<!--<record id="time_line_1jh000031" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000021"/>-->
<!--</record>-->
<!--<record id="time_liasdne_1000041" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000021"/>-->
<!--</record>-->
<!--&lt;!&ndash; 13:00 &ndash;&gt;-->
<!--<record id="time_000031" model="salon.period">-->
<!--<field name="name">13.00</field>-->
<!--<field name="period_type">off</field>-->
<!--<field name="off_reason">Lunch Break</field>-->
<!--<field name="day_id" ref="day_000_cc2"/>-->
<!--</record>-->
<!--<record id="time_line_x11000011" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000031"/>-->
<!--</record>-->
<!--<record id="time_line_1100x0021" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000031"/>-->
<!--</record>-->
<!--<record id="time_line_11x000031" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000031"/>-->
<!--</record>-->
<!--<record id="time_linex_11000041" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000031"/>-->
<!--</record>-->
<!--&lt;!&ndash; 15:00 &ndash;&gt;-->
<!--<record id="time_000041" model="salon.period">-->
<!--<field name="name">15.00</field>-->
<!--<field name="day_id" ref="day_000_cc2"/>-->
<!--</record>-->
<!--<record id="time_line_1110x00011" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000041"/>-->
<!--</record>-->
<!--<record id="time_line_111000021" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000041"/>-->
<!--</record>-->
<!--<record id="time_line_111000031" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000041"/>-->
<!--</record>-->
<!--<record id="time_line_111000041" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000041"/>-->
<!--</record>-->
<!--&lt;!&ndash; 19:00&ndash;&gt;-->
<!--<record id="time_000051" model="salon.period">-->
<!--<field name="name">19.00</field>-->
<!--<field name="day_id" ref="day_000_cc2"/>-->
<!--</record>-->
<!--<record id="time_line_1111000011" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000051"/>-->
<!--</record>-->
<!--<record id="time_line_1111000021" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000051"/>-->
<!--</record>-->
<!--<record id="time_line_1111000031" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000051"/>-->
<!--</record>-->
<!--<record id="time_line_1111000041" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000051"/>-->
<!--</record>-->
<!--&lt;!&ndash;=============================================================================================================&ndash;&gt;-->
<!--&lt;!&ndash;day 03&ndash;&gt;-->
<!--<record id="day_000_cc3" model="salon.day">-->
<!--<field name="name">03</field>-->
<!--<field name="month_id" ref="month_0001"/>-->
<!--</record>-->
<!--&lt;!&ndash; 09.30 &ndash;&gt;-->
<!--<record id="time_000061" model="salon.period">-->
<!--<field name="name">09.30</field>-->
<!--<field name="day_id" ref="day_000_cc3"/>-->
<!--</record>-->
<!--<record id="time_line_200001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000061"/>-->
<!--</record>-->
<!--<record id="time_line_df100002" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000061"/>-->
<!--</record>-->
<!--<record id="time_line_200003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000061"/>-->
<!--</record>-->
<!--<record id="time_line_200004" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000061"/>-->
<!--</record>-->
<!--&lt;!&ndash; 11:00 &ndash;&gt;-->
<!--<record id="time_000062" model="salon.period">-->
<!--<field name="name">11.00</field>-->
<!--<field name="day_id" ref="day_000_cc3"/>-->
<!--</record>-->
<!--<record id="time_line_10sf0001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000062"/>-->
<!--</record>-->
<!--<record id="time_line_1000xc02" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000062"/>-->
<!--</record>-->
<!--<record id="time_line_10dfas0003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000062"/>-->
<!--</record>-->
<!--<record id="time_line_1000dshy04" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000062"/>-->
<!--</record>-->
<!--&lt;!&ndash; 13:00 &ndash;&gt;-->
<!--<record id="time_000063" model="salon.period">-->
<!--<field name="name">13.00</field>-->
<!--<field name="period_type">off</field>-->
<!--<field name="off_reason">Lunch Break</field>-->
<!--<field name="day_id" ref="day_000_cc3"/>-->
<!--</record>-->
<!--<record id="time_line_110x0001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000063"/>-->
<!--</record>-->
<!--<record id="time_line_110x0002" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000063"/>-->
<!--</record>-->
<!--<record id="time_line_x1100003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000063"/>-->
<!--</record>-->
<!--<record id="time_line_1x100004" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000063"/>-->
<!--</record>-->
<!--&lt;!&ndash; 15:00 &ndash;&gt;-->
<!--<record id="time_000064" model="salon.period">-->
<!--<field name="name">15.00</field>-->
<!--<field name="day_id" ref="day_000_cc3"/>-->
<!--</record>-->
<!--<record id="time_line_11100001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000064"/>-->
<!--</record>-->
<!--<record id="time_line_11100002" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000064"/>-->
<!--</record>-->
<!--<record id="time_line_11100003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000064"/>-->
<!--</record>-->
<!--<record id="f" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000064"/>-->
<!--</record>-->
<!--&lt;!&ndash; 19:00&ndash;&gt;-->
<!--<record id="time_000065" model="salon.period">-->
<!--<field name="name">19.00</field>-->
<!--<field name="day_id" ref="day_000_cc3"/>-->
<!--</record>-->
<!--<record id="time_line_11110dsz0001" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0001"/>-->
<!--<field name="period_id" ref="time_000065"/>-->
<!--</record>-->
<!--<record id="time_line_111100k002" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0002"/>-->
<!--<field name="period_id" ref="time_000065"/>-->
<!--</record>-->
<!--<record id="time_line_111100sq003" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0003"/>-->
<!--<field name="period_id" ref="time_000065"/>-->
<!--</record>-->
<!--<record id="time_line_111op100004" model="salon.period.line">-->
<!--<field name="chair_id" ref="chair_0004"/>-->
<!--<field name="period_id" ref="time_000065"/>-->
<!--</record>-->
<!--DEMO GENERAL TIMES -->
<record id="time_gen_0001" model="salon.period">
<field name="name">9.30</field>
</record>
<record id="time_gen_0002" model="salon.period">
<field name="name">11.30</field>
</record>
<record id="time_gen_0003" model="salon.period">
<field name="name">13.00</field>
<field name="period_type">off</field>
<field name="off_reason">Lunch Break</field>
</record>
<record id="time_gen_0004" model="salon.period">
<field name="name">15.30</field>
</record>
<record id="time_gen_0005" model="salon.period">
<field name="name">19.00</field>
</record>
</data>
</openerp>

1
salon_operation/models/__init__.py

@ -0,0 +1 @@
import chair,period,day,month,autofill_month,salon_book, confirm_booking

55
salon_operation/models/autofill_month.py

@ -0,0 +1,55 @@
from openerp import models, fields,api,http,SUPERUSER_ID,_
class AutoFillWizard(models.TransientModel):
_name = 'salon.auto_fill.wizard'
name = fields.Char('Name')
month = fields.Integer('Month')
year = fields.Integer('Year')
no_days = fields.Integer('No of Days')
@api.one
@api.onchange('month')
def onchange_month(self):
days = {1: 31, 2: 29, 3: 31,
4: 30, 5: 31, 6: 30,
7: 31, 8: 31, 9: 30,
10: 31, 11: 30, 12: 31, }.get(self.month)
if days:
self.no_days = days
@api.one
def act_auto_fill(self):
if self.name:
month_name = self.name
else:
month_name = 'Untitled Month'+str(self.id)
times_list = []
for Each_Time in self.env['salon.period'].search([('day_id', '=', None)]):
time_line_list = []
for Each_Chair in self.env['salon.chair'].search([]):
time_line_list.append((0, 0, {'chair_id': Each_Chair.id}))
times_list.append((0, 0, {'name': Each_Time.name,
'period_type': Each_Time.period_type,
'off_reason': Each_Time.off_reason,
'chair_lines': time_line_list}))
days_list = []
for day_count in range(1, self.no_days+1):
day_line = {'name': day_count,
'period_lines': times_list}
days_list.append((0, 0, day_line))
month_values = {'name': month_name,
'month': self.month,
'year': self.year,
'day_lines': days_list}
month_obj = self.pool.get('salon.month')
month_obj.create(self._cr, self._uid, month_values)
@api.one
def close_auto_fill(self):
pass

14
salon_operation/models/chair.py

@ -0,0 +1,14 @@
from openerp import models, fields,api,http,SUPERUSER_ID
class Chairs(models.Model):
_name = 'salon.chair'
name = fields.Char()
related_employee = fields.Many2one('hr.employee', string='Related Employee')
_sql_constraints = [
('name_unique', 'unique(name)', 'This chair is already exist !'),
('related_employee_unique', 'unique(related_employee)', 'This person was reserved for another chair !')]

78
salon_operation/models/confirm_booking.py

@ -0,0 +1,78 @@
from openerp import models, fields,api,http,SUPERUSER_ID,_
from openerp.osv import fields, osv
class SaleOrder(models.Model):
_inherit = 'sale.order'
def action_wait(self, cr, uid, ids, context=None):
context = context or {}
for o in self.browse(cr, uid, ids):
if not any(line.state != 'cancel' for line in o.order_line):
raise osv.except_osv(_('Error!'),_('You cannot confirm a this booking which has no line.'))
noprod = self.test_no_product(cr, uid, o, context)
if (o.order_policy == 'manual') or noprod:
self.write(cr, uid, [o.id], {'state': 'manual', 'date_confirm': fields.date.context_today(self, cr, uid, context=context)})
# =================================================================
booking_no = o.name
values = self.get_values_booking(cr, uid, ids, context)[0]
for Each_Day in values['month'].day_lines:
if Each_Day.id == values['day'].id:
for Each_Time in Each_Day.period_lines:
if Each_Time.id == values['time'].id:
for Each_Time_Line in Each_Time.chair_lines:
if Each_Time_Line.chair_id.id == values['chair'].id:
print Each_Day.name, Each_Time.name, Each_Time_Line.chair_id.name
if Each_Time_Line.booked:
raise osv.except_osv(_('Booking Failed !'),_('Mismatch in booking, this chair may be already booked.'))
else:
print 'nooooooooooooo'
cr.execute("UPDATE salon_period_line SET partner_id = %s,book_no = %s where period_id = %s and chair_id = %s", (str(values['partner'].id), booking_no, str(values['time'].id), str(values['chair'].id)))
# =================================================================
else:
self.write(cr, uid, [o.id], {'state': 'progress', 'date_confirm': fields.date.context_today(self, cr, uid, context=context)})
# =================================================================
booking_no = o.name
values = self.get_values_booking(cr, uid, ids, context)[0]
for Each_Day in values['month'].day_lines:
if Each_Day.id == values['day'].id:
for Each_Time in Each_Day.period_lines:
if Each_Time.id == values['time'].id:
for Each_Time_Line in Each_Time.chair_lines:
if Each_Time_Line.chair_id.id == values['chair'].id:
print Each_Day.name, Each_Time.name, Each_Time_Line.chair_id.name
if Each_Time_Line.booked:
raise osv.except_osv(_('Booking Failed !'),_('Mismatch in booking, this chair may be already booked.'))
else:
print 'nooooooooooooo'
cr.execute("UPDATE salon_period_line SET partner_id = %s,book_no = %s where period_id = %s and chair_id = %s", (str(values['partner'].id), booking_no, str(values['time'].id), str(values['chair'].id)))
# =================================================================
self.pool.get('sale.order.line').button_confirm(cr, uid, [x.id for x in o.order_line if x.state != 'cancel'])
return True
@api.one
def get_values_booking(self):
return {'month': self.for_month,
'day': self.for_day,
'time': self.for_time,
'chair': self.char_id,
'partner': self.partner_id}
def action_button_confirm(self, cr, uid, ids, context=None):
# ======================================
# values = self.get_values_booking(cr, uid, ids, context)[0]
# cr.execute("UPDATE salon_period_line SET partner_id = %s where period_id = %s and chair_id = %s", (str(values['partner'].id), str(values['time'].id), str(values['chair'].id)))
# ======================================
if not context:
context = {}
assert len(ids) == 1, 'This option should only be used for a single id at a time.'
self.signal_workflow(cr, uid, ids, 'order_confirm')
if context.get('send_email'):
self.force_quotation_send(cr, uid, ids, context=context)
return True

88
salon_operation/models/day.py

@ -0,0 +1,88 @@
from openerp import models, fields,api,http,SUPERUSER_ID,_
class Days(models.Model):
_name = 'salon.day'
_rec_name = 'display_booked'
name = fields.Integer('Day')
day_type = fields.Selection([('on', 'On'), ('off', 'Off')], default='on', string='On/Off')
off_reason = fields.Char()
period_lines = fields.One2many('salon.period', 'day_id')
month_id = fields.Many2one('salon.month')
@api.one
def _get_booked(self):
count = 0
total = 0
for Each_Line in self.period_lines:
if Each_Line.period_type == 'on':
if Each_Line.booked:
count += 1
total += 1
else:
total += 1
if count < total:
self.booked = False
else:
self.booked = True
booked = fields.Boolean('Fully Booked', compute='_get_booked')
@api.one
def _get_display_booked(self):
count = 0
for Each_Line in self.period_lines:
if Each_Line.booked:
count += 1
if count < len(self.period_lines):
self.display_booked = str(self.name)
else:
self.display_booked = str(self.name) + '- Fully Booked'
display_booked = fields.Char(compute='_get_display_booked')
# @api.one
# def _get_day_stat(self):
# self.day_stat = self.days.day_type
# day_stat = fields.Char(compute='_get_day_stat', string='On/Off')
#
# day_stat = fields.Selection([('on', 'On'), ('off', 'Off')], default='on')
# period_lines = fields.One2many('salon.day.line', 'day_id')
#
# _sql_constraints = [
# ('name_unique', 'unique(name)', 'This day is already exist !')]
#
# @api.one
# def get_day(self):
# if self.name >0 and self.name <= 31:
# return True
# else:
# return False
#
# def check_day_valid(self, cr, uid, ids, context=None):
# return self.get_day(cr, uid, ids, context)[0]
#
# _constraints = [
# (check_day_valid, 'You created an invalid day', ['name']),
# ]
#
#
# class DayLines(models.Model):
# _name = 'salon.day.line'
#
# period_id = fields.Many2one('salon.period', string='Time')
# # @api.one
# # def _get_period_stat(self):
# # self.period_stat = self.period_id.period_type
#
# # period_stat = fields.Char(compute='_get_period_stat', string='On/Off')
# day_id = fields.Many2one('salon.day')
# period_stat = fields.Selection([('on', 'On'), ('off', 'Off')], default='on')
#

112
salon_operation/models/month.py

@ -0,0 +1,112 @@
from openerp import models, fields,api,http,SUPERUSER_ID
class Months(models.Model):
_name = 'salon.month'
_rec_name = 'display_booked'
name = fields.Char('Name')
_sql_constraints = [
('name_unique', 'unique(name)', 'This month is already exist !')]
month = fields.Integer('Month')
year = fields.Integer('Year')
day_lines = fields.One2many('salon.day', 'month_id')
@api.one
def _get_booked(self):
count = 0
total = 0
for Each_Day in self.day_lines:
if Each_Day.day_type == 'on':
if Each_Day.booked:
count += 1
total += 1
else:
total += 1
if count < total:
self.booked = False
else:
self.booked = True
# print 'count', count
# print 'total', total
#
#
# for Each_Day in self.day_lines:
# if Each_Day.booked:
# count += 1
# if count < len(self.day_lines):
# self.booked = False
# else:
# self.booked = True
booked = fields.Boolean('Fully Booked', compute='_get_booked', default=False)
@api.one
def _get_display_booked(self):
count = 0
for Each_Day in self.day_lines:
if Each_Day.booked:
count += 1
if count < len(self.day_lines):
self.display_booked = str(self.name)
else:
self.display_booked = str(self.name) + ' - Fully Booked'
display_booked = fields.Char(compute='_get_display_booked')
@api.one
def _get_month_show(self):
if self.month == 1:
self.month_show = 'JAN'
elif self.month == 2:
self.month_show = 'FEB'
elif self.month == 3:
self.month_show = 'MAR'
elif self.month == 4:
self.month_show = 'APR'
elif self.month == 5:
self.month_show = 'MAY'
elif self.month == 6:
self.month_show = 'JUN'
elif self.month == 7:
self.month_show = 'JUL'
elif self.month == 8:
self.month_show = 'AUG'
elif self.month == 9:
self.month_show = 'SEP'
elif self.month == 10:
self.month_show = 'OCT'
elif self.month == 11:
self.month_show = 'NOV'
elif self.month == 12:
self.month_show = 'DEC'
else:
self.month_show = 'None'
month_show = fields.Char(compute='_get_month_show')
# day_lines = fields.One2many('salon.month.line', 'month_id')
#
#
# class MonthLines(models.Model):
# _name = 'salon.month.line'
#
# days = fields.Many2one('salon.day')
# month_id = fields.Many2one('salon.month')
#
# # @api.one
# # def _get_day_stat(self):
# # self.day_stat = self.days.day_type
# # day_stat = fields.Char(compute='_get_day_stat', string='On/Off')
#
# day_stat = fields.Selection([('on', 'On'), ('off', 'Off')], default='on')

83
salon_operation/models/period.py

@ -0,0 +1,83 @@
from openerp import models, fields,api,http,SUPERUSER_ID,_
from openerp.http import request
class Period(models.Model):
_name = 'salon.period'
_rec_name = 'display_booked'
name = fields.Float('Time')
# _sql_constraints = [
# ('name_unique', 'unique(name)', 'This time is already exist !')]
chair_lines = fields.One2many('salon.period.line', 'period_id')
period_type = fields.Selection([('on', 'On'), ('off', 'Off')], default='on', string='On/Off')
off_reason = fields.Char()
day_id = fields.Many2one('salon.day')
@api.one
def _get_booked(self):
count = 0
for Each_Chair in self.chair_lines:
if Each_Chair.partner_id.id:
count += 1
if count < len(self.chair_lines):
self.booked = False
else:
self.booked = True
booked = fields.Boolean('Fully Booked', compute='_get_booked')
@api.one
def _get_display_booked(self):
count = 0
for Each_Chair in self.chair_lines:
if Each_Chair.partner_id.id:
count += 1
if count < len(self.chair_lines):
self.display_booked = str(self.name)
else:
self.display_booked = str(self.name) + ' -Fully Booked'
display_booked = fields.Char(compute='_get_display_booked')
# @api.onchange('chair_lines')
# def unique_chair(self):
# # GET VALUE TO CHILD CHAIR
# selected_chair = str(request.session.get('onchange_chair_selected'))
# request.session['onchange_chair_selected'] = None
# already_exist = 0
# for Each_Chair in self.chair_lines:
# if Each_Chair.chair_id.name == selected_chair:
# already_exist += 1
# if already_exist >= 2:
# return {'warning': {
# 'title': _('Constraint Error'),
# 'message': 'This chair is already selected for this period',
# }}
class PeriodLine(models.Model):
_name = 'salon.period.line'
chair_id = fields.Many2one('salon.chair', string='Chair')
period_id = fields.Many2one('salon.period')
partner_id = fields.Many2one('res.partner', string='Customer')
@api.one
def _get_related_emp(self):
self.related_employee = self.chair_id.related_employee
related_employee = fields.Many2one('hr.employee', compute='_get_related_emp', string='Dressing Person')
@api.one
def _get_booked(self):
if self.partner_id:
self.booked = True
else:
self.booked = False
booked = fields.Boolean('Booked', compute='_get_booked')
book_no = fields.Char('Booking No', default=' ')

161
salon_operation/models/salon_book.py

@ -0,0 +1,161 @@
from openerp import models, fields,api,http,SUPERUSER_ID, _
from openerp.addons.sale.sale import sale_order
from openerp.http import request
from datetime import timedelta
from dateutil import parser
class SaleOrder(models.Model):
_inherit = 'sale.order'
@api.one
@api.onchange('char_id')
def onchange_chair(self):
self.employee_id = self.char_id.related_employee
@api.one
@api.onchange('employee_id')
def onchange_employee(self):
have_any = False
for Each_Chair in self.env['salon.chair'].search([]):
if self.employee_id == Each_Chair.related_employee:
have_any = Each_Chair
self.char_id = have_any
employee_id = fields.Many2one('hr.employee', 'Dressing Person', store=True)
char_id = fields.Many2one('salon.chair', string='Chair')
state = fields.Selection([
('draft', 'Draft'),
('sent', 'Sent'),
('cancel', 'Cancelled'),
('waiting_date', 'Waiting Schedule'),
('progress', 'Scheduled'),
('manual', 'To Invoice'),
('shipping_except', 'Shipping Exception'),
('invoice_except', 'Invoice Exception'),
('done', 'Done'),
], 'Status', readonly=True, copy=False, help="Gives the status of the quotation or sales order.\
\nThe exception status is automatically set when a cancel operation occurs \
in the invoice validation (Invoice Exception) or in the picking list process (Shipping Exception).\nThe 'Waiting Schedule' status is set when the invoice is confirmed\
but waiting for the scheduler to run on the order date.", select=True)
name = fields.Char('Order Reference', required=True, copy=False,
readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, select=True)
order_line = fields.One2many('sale.order.line', 'order_id', 'Items', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, copy=True)
@api.onchange('name')
def onchange_name(self):
request.session['name_schedule'] = self.name
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
if vals.get('name', '/') == '/':
vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'sale.order', context=context) or '/'
# ====================================================================================
vals['name'] = vals['name'].replace('SO', 'NO-')
if str(request.session.get('name_schedule')) == '/':
vals['name'] = str(vals['name'])
else:
vals['name'] = str(vals['name']) + ' ' + str(request.session.get('name_schedule'))
request.session['name_schedule'] = None
# ====================================================================================
if vals.get('partner_id') and any(f not in vals for f in ['partner_invoice_id', 'partner_shipping_id', 'pricelist_id', 'fiscal_position']):
defaults = self.onchange_partner_id(cr, uid, [], vals['partner_id'], context=context)['value']
if not vals.get('fiscal_position') and vals.get('partner_shipping_id'):
delivery_onchange = self.onchange_delivery_id(cr, uid, [], vals.get('company_id'), None, vals['partner_id'], vals.get('partner_shipping_id'), context=context)
defaults.update(delivery_onchange['value'])
vals = dict(defaults, **vals)
ctx = dict(context or {}, mail_create_nolog=True)
new_id = super(sale_order, self).create(cr, uid, vals, context=ctx)
self.message_post(cr, uid, [new_id], body=_("Quotation created"), context=ctx)
return new_id
@api.one
def get_warning(self):
if self.for_month.booked:
self.for_month = False
self.month_state_show = ' ' \
' ' \
'Sorry, this month is fully booked'
else:
self.month_state_show = ''
@api.one
def get_warning_for_day(self):
if self.for_day.booked:
self.for_day = False
self.month_state_show = ' ' \
' ' \
'Sorry, this day is fully booked'
else:
self.month_state_show = ' '
@api.one
def get_warning_for_time(self):
if self.for_time.booked:
self.for_time = False
self.month_state_show = ' ' \
' ' \
'Sorry, this time is fully booked'
else:
self.month_state_show = ' '
@api.one
def get_selected_month(self):
return self.for_month.id
@api.onchange('for_month')
def onchange_month(self):
# ====clear=other=fields=========
self.for_day = False
self.char_id = False
self.for_time = False
# ===============================
self.get_warning()
return {'domain': {'for_day': [('month_id', '=', self.get_selected_month()),
('day_type', '=', 'on'),
('booked', '=', False)]}}
@api.one
def get_selected_day(self):
return self.for_day.id
@api.onchange('for_day')
def onchange_day(self):
# ===Clear=other=fields=======
self.char_id = False
self.for_time = False
# ============================
self.get_warning_for_day()
# for i in self.env['salon.period'].search([]):
# if i.day_id.id == False:
# print 'kkkkkkkk'
selected_day = self.get_selected_day()
if selected_day[0]:
print ''
else:
selected_day = -1
return {'domain': {'for_time': [('day_id', '=', selected_day), ('period_type', '=', 'on')]}}
@api.one
def get_selected_time(self):
return self.for_time
@api.onchange('for_time')
def onchange_time(self):
# ===Clear=other=fields=======
self.char_id = False
# ============================
self.get_warning_for_time()
chair_ids = []
for Each_Period_line in self.get_selected_time()[0].chair_lines:
if Each_Period_line.booked:
chair_ids.append(Each_Period_line.chair_id.id)
return {'domain': {'char_id': [('id', 'not in', chair_ids)]}}
created_domain = [('booked', '=', False)]
for_month = fields.Many2one('salon.month', domain=created_domain)
for_day = fields.Many2one('salon.day', domain=[('month_id', '=', -1)])
for_time = fields.Many2one('salon.period', domain=[('day_id', 'in', [-69]), [('day_id', '!=', None)]])
month_state_show = fields.Char(default=' ')

6
salon_operation/security/ir.model.access.csv

@ -0,0 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_chair_sale_user,access_chair_sale_user,model_salon_chair,base.group_sale_salesman,1,1,1,0
access_month_sale_user,access_month_sale_user,model_salon_month,base.group_sale_salesman,1,1,1,0
access_day_sale_user,access_day_sale_user,model_salon_day,base.group_sale_salesman,1,1,1,0
access_time_sale_user,access_time_sale_user,model_salon_period,base.group_sale_salesman,1,1,1,0
access_time_line_sale_user,access_time_line_sale_user,model_salon_period_line,base.group_sale_salesman,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_chair_sale_user access_chair_sale_user model_salon_chair base.group_sale_salesman 1 1 1 0
3 access_month_sale_user access_month_sale_user model_salon_month base.group_sale_salesman 1 1 1 0
4 access_day_sale_user access_day_sale_user model_salon_day base.group_sale_salesman 1 1 1 0
5 access_time_sale_user access_time_sale_user model_salon_period base.group_sale_salesman 1 1 1 0
6 access_time_line_sale_user access_time_line_sale_user model_salon_period_line base.group_sale_salesman 1 1 1 0

BIN
salon_operation/static/description/Times.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
salon_operation/static/description/auto_fill.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
salon_operation/static/description/booked.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
salon_operation/static/description/chair_under_conf.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

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

Loading…
Cancel
Save