@ -0,0 +1,24 @@ |
|||||
|
Fleet Rental Management v9 |
||||
|
========================== |
||||
|
This module will helps you to give the vehicles for Rent. |
||||
|
|
||||
|
Features |
||||
|
======== |
||||
|
|
||||
|
* Multiple Plans for Rental Contract(Days/Weeks/Months/Years). |
||||
|
* Integrated with Accounting Module. |
||||
|
* Automatically Create Recurring Invoices. |
||||
|
* Sending email for confirmation, first payment and recurrent invoices. |
||||
|
* Check List Facility. |
||||
|
* Separate Tree view for Checklist. |
||||
|
* Damage Checking Facility. |
||||
|
* Billing Facility for Damages/Check Lists. |
||||
|
* Contract Payment Validations. |
||||
|
* Detailed Fleet Rental Analysis Report. |
||||
|
* Access Rights From Multiple Level. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
Developer: Nilmar Shereef @ cybrosys, shereef@cybrosys.in |
||||
|
Developer: Jesni Banu @ cybrosys, jesni@cybrosys.in |
||||
|
Developer: Avinash NK @ cybrosys, avinash@cybrosys.in |
@ -0,0 +1,25 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2016-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Cybrosys(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
import models |
||||
|
import reports |
||||
|
|
@ -0,0 +1,46 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2016-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Cybrosys(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
{ |
||||
|
'name': 'Fleet Rental Management', |
||||
|
'summary': """The Complete Solution for a Car/Vehicle Rental System""", |
||||
|
'version': '9.0.1.0.0', |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'website': "http://www.cybrosys.com", |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
"category": "Industries", |
||||
|
'depends': ['base', 'account', 'fleet', 'mail'], |
||||
|
'data': ['security/rental_security.xml', |
||||
|
'security/ir.model.access.csv', |
||||
|
'views/car_rental_view.xml', |
||||
|
'views/checklist_view.xml', |
||||
|
'views/car_tools_view.xml', |
||||
|
'reports/rental_report.xml', |
||||
|
'data/fleet_rental_data.xml', |
||||
|
], |
||||
|
'demo': [ |
||||
|
], |
||||
|
'images': ['static/description/banner.jpg'], |
||||
|
'license': 'LGPL-3', |
||||
|
'installable': True, |
||||
|
'application': False, |
||||
|
} |
@ -0,0 +1,22 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<openerp> |
||||
|
<data noupdate="1"> |
||||
|
<record model="product.template" id="fleet_service_product"> |
||||
|
<field name="name">Fleet Rental Service</field> |
||||
|
<field name="type">service</field> |
||||
|
</record> |
||||
|
<record id="vehicle_state_rent" model="fleet.vehicle.state"> |
||||
|
<field name="name">Rent</field> |
||||
|
<field name="sequence">3</field> |
||||
|
</record> |
||||
|
<record id="fleet.fleet_user_vehicle_visibility" model="ir.rule"> |
||||
|
<field name="name">User can only see his/her vehicle</field> |
||||
|
<field name="model_id" ref="fleet.model_fleet_vehicle"/> |
||||
|
<field name="groups" eval="[(4, ref('fleet.group_fleet_user')), (4, ref('rental_group_user'))]"/> |
||||
|
<field name="perm_read" eval="True"/> |
||||
|
<field name="perm_write" eval="True"/> |
||||
|
<field name="perm_create" eval="True"/> |
||||
|
<field name="perm_unlink" eval="False"/> |
||||
|
</record> |
||||
|
</data> |
||||
|
</openerp> |
@ -0,0 +1,24 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2016-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Cybrosys(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
import car_rental |
||||
|
|
@ -0,0 +1,470 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2016-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Cybrosys(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from datetime import datetime, date |
||||
|
from openerp import models, fields, api, _ |
||||
|
from openerp.exceptions import UserError, Warning |
||||
|
|
||||
|
|
||||
|
class CarRentalContract(models.Model): |
||||
|
_name = 'car.rental.contract' |
||||
|
_description = 'Fleet Rental Management' |
||||
|
_inherit = ['mail.thread', 'ir.needaction_mixin'] |
||||
|
|
||||
|
image = fields.Binary(related='vehicle_id.image', string="Logo") |
||||
|
image_medium = fields.Binary(related='vehicle_id.image_medium', string="Logo (medium)") |
||||
|
image_small = fields.Binary(related='vehicle_id.image_small', string="Logo (small)") |
||||
|
name = fields.Char(string="Name", default="Draft Contract", readonly=True, copy=False) |
||||
|
customer_id = fields.Many2one('res.partner', required=True, help="Customer") |
||||
|
vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle", required=True, help="Vehicle", copy=False) |
||||
|
car_brand = fields.Char(string="Fleet Brand", size=50) |
||||
|
car_color = fields.Char(string="Fleet Color", size=50) |
||||
|
cost = fields.Float(string="Rent Cost", help="This fields is to determine the cost of rent per hour", required=True) |
||||
|
rent_start_date = fields.Date(string="Rent Start Date", required=True, default=datetime.today(), |
||||
|
help="Starting date of your contract", track_visibility='onchange') |
||||
|
rent_end_date = fields.Date(string="Rent End Date", required=True, help="Ending date of your contract", |
||||
|
track_visibility='onchange') |
||||
|
state = fields.Selection([('draft', 'Draft'), ('running', 'Running'), ('cancel', 'Cancel'), |
||||
|
('checking', 'Checking'), ('invoice', 'Invoice'), ('done', 'Done')], string="State", |
||||
|
default="draft", copy=False, track_visibility='onchange') |
||||
|
notes = fields.Text(string="Details") |
||||
|
cost_generated = fields.Float('Recurring Cost', |
||||
|
help="Costs paid at regular intervals, depending on the cost frequency") |
||||
|
cost_frequency = fields.Selection([('no', 'No'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), |
||||
|
('yearly', 'Yearly')], string="Recurring Cost Frequency", |
||||
|
help='Frequency of the recurring cost', required=True) |
||||
|
journal_type = fields.Many2one('account.journal', 'Journal', |
||||
|
default=lambda self: self.env['account.journal'].search([('id', '=', 1)])) |
||||
|
account_type = fields.Many2one('account.account', 'Account', |
||||
|
default=lambda self: self.env['account.account'].search([('id', '=', 17)])) |
||||
|
recurring_line = fields.One2many('fleet.rental.line', 'rental_number', readonly=True, help="Recurring Invoices", |
||||
|
copy=False) |
||||
|
first_payment = fields.Float(string='First Payment', help="Advance Payment", track_visibility='onchange') |
||||
|
first_payment_inv = fields.Many2one('account.invoice', copy=False) |
||||
|
first_invoice_created = fields.Boolean(string="First Invoice Created", invisible=True, copy=False) |
||||
|
attachment_ids = fields.Many2many('ir.attachment', 'car_rent_checklist_ir_attachments_rel', |
||||
|
'rental_id', 'attachment_id', string="Attachments", |
||||
|
help="Images of the vehicle before contract/any attachments") |
||||
|
checklist_line = fields.One2many('car.rental.checklist', 'checklist_number', string="Checklist", help="Check List") |
||||
|
total = fields.Float(string="Total(Tools)", readonly=True, copy=False) |
||||
|
tools_missing_cost = fields.Float(string="Tools missing cost", readonly=True, copy=False) |
||||
|
damage_cost = fields.Float(string="Damage cost", copy=False) |
||||
|
damage_cost_sub = fields.Float(string="Damage cost", readonly=True, copy=False) |
||||
|
total_cost = fields.Float(string="Total cost", readonly=True, copy=False) |
||||
|
invoice_count = fields.Integer(compute='_invoice_count', string='# Invoice', copy=False) |
||||
|
sales_person = fields.Many2one('res.users', string='Sales Person', default=lambda self: self.env.uid, |
||||
|
track_visibility='always') |
||||
|
|
||||
|
@api.constrains('rent_start_date', 'rent_end_date') |
||||
|
def validate_dates(self): |
||||
|
if self.rent_end_date < self.rent_start_date: |
||||
|
raise Warning("Please select the valid end date.") |
||||
|
|
||||
|
@api.multi |
||||
|
def set_to_done(self): |
||||
|
invoice_ids = self.env['account.invoice'].search([('origin', '=', self.name)]) |
||||
|
f = 0 |
||||
|
for each in invoice_ids: |
||||
|
if each.state != 'paid': |
||||
|
f = 1 |
||||
|
break |
||||
|
if f == 0: |
||||
|
self.state = 'done' |
||||
|
else: |
||||
|
raise UserError("Some Invoices are pending") |
||||
|
|
||||
|
@api.multi |
||||
|
def _invoice_count(self): |
||||
|
invoice_ids = self.env['account.invoice'].search([('origin', '=', self.name)]) |
||||
|
self.invoice_count = len(invoice_ids) |
||||
|
|
||||
|
@api.constrains('state') |
||||
|
def state_changer(self): |
||||
|
if self.state == "running": |
||||
|
state_id = self.env['fleet.vehicle.state'].search([('name', '=', "Rent")]).id |
||||
|
self.vehicle_id.write({'state_id': state_id}) |
||||
|
elif self.state == "done": |
||||
|
state_id = self.env['fleet.vehicle.state'].search([('name', '=', "Active")]).id |
||||
|
self.vehicle_id.write({'state_id': state_id}) |
||||
|
|
||||
|
@api.constrains('checklist_line', 'damage_cost') |
||||
|
def total_updater(self): |
||||
|
total = 0.0 |
||||
|
tools_missing_cost = 0.0 |
||||
|
for records in self.checklist_line: |
||||
|
total += records.price |
||||
|
if not records.checklist_active: |
||||
|
tools_missing_cost += records.price |
||||
|
self.total = total |
||||
|
self.tools_missing_cost = tools_missing_cost |
||||
|
self.damage_cost_sub = self.damage_cost |
||||
|
self.total_cost = tools_missing_cost + self.damage_cost |
||||
|
|
||||
|
@api.model |
||||
|
def fleet_scheduler(self): |
||||
|
inv_obj = self.env['account.invoice'] |
||||
|
inv_line_obj = self.env['account.invoice.line'] |
||||
|
recurring_obj = self.env['fleet.rental.line'] |
||||
|
today = date.today() |
||||
|
for records in self.search([]): |
||||
|
start_date = datetime.strptime(records.rent_start_date, '%Y-%m-%d').date() |
||||
|
end_date = datetime.strptime(records.rent_end_date, '%Y-%m-%d').date() |
||||
|
if end_date >= date.today(): |
||||
|
temp = 0 |
||||
|
if records.cost_frequency == 'daily': |
||||
|
temp = 1 |
||||
|
elif records.cost_frequency == 'weekly': |
||||
|
week_days = (date.today() - start_date).days |
||||
|
if week_days % 7 == 0 and week_days != 0: |
||||
|
temp = 1 |
||||
|
elif records.cost_frequency == 'monthly': |
||||
|
if start_date.day == date.today().day and start_date != date.today(): |
||||
|
temp = 1 |
||||
|
elif records.cost_frequency == 'yearly': |
||||
|
if start_date.day == date.today().day and start_date.month == date.today().month and \ |
||||
|
start_date != date.today(): |
||||
|
temp = 1 |
||||
|
if temp == 1 and records.cost_frequency != "no" and records.state == "running": |
||||
|
supplier = records.customer_id |
||||
|
inv_data = { |
||||
|
'name': supplier.name, |
||||
|
'reference': supplier.name, |
||||
|
'account_id': supplier.property_account_payable_id.id, |
||||
|
'partner_id': supplier.id, |
||||
|
'currency_id': records.account_type.company_id.currency_id.id, |
||||
|
'journal_id': records.journal_type.id, |
||||
|
'origin': records.name, |
||||
|
'company_id': records.account_type.company_id.id, |
||||
|
'date_due': self.rent_end_date, |
||||
|
} |
||||
|
inv_id = inv_obj.create(inv_data) |
||||
|
product_id = self.env['product.product'].search([("name", "=", "Fleet Rental Service")]) |
||||
|
if product_id.property_account_income_id.id: |
||||
|
income_account = product_id.property_account_income_id |
||||
|
elif product_id.categ_id.property_account_income_categ_id.id: |
||||
|
income_account = product_id.categ_id.property_account_income_categ_id |
||||
|
else: |
||||
|
raise UserError( |
||||
|
_('Please define income account for this product: "%s" (id:%d).') % (product_id.name, |
||||
|
product_id.id)) |
||||
|
recurring_data = { |
||||
|
'name': records.vehicle_id.name, |
||||
|
'date_today': today, |
||||
|
'account_info': income_account.name, |
||||
|
'rental_number': records.id, |
||||
|
'recurring_amount': records.cost_generated, |
||||
|
'invoice_number': inv_id.id |
||||
|
} |
||||
|
recurring_obj.create(recurring_data) |
||||
|
inv_line_data = { |
||||
|
'name': records.vehicle_id.name, |
||||
|
'account_id': income_account.id, |
||||
|
'price_unit': records.cost_generated, |
||||
|
'quantity': 1, |
||||
|
'product_id': product_id.id, |
||||
|
'invoice_id': inv_id.id, |
||||
|
} |
||||
|
inv_line_obj.create(inv_line_data) |
||||
|
mail_content = _( |
||||
|
'<h3>Reminder Recurrent Payment!</h3><br/>Hi %s, <br/> This is to remind you that the ' |
||||
|
'recurrent payment for the ' |
||||
|
'rental contract has to be done.' |
||||
|
'Please make the payment at the earliest.' |
||||
|
'<br/><br/>' |
||||
|
'Please find the details below:<br/><br/>' |
||||
|
'<table><tr><td>Contract Ref<td/><td> %s<td/><tr/>' |
||||
|
'<tr/><tr><td>Amount <td/><td> %s<td/><tr/>' |
||||
|
'<tr/><tr><td>Due Date <td/><td> %s<td/><tr/>' |
||||
|
'<tr/><tr><td>Responsible Person <td/><td> %s, %s<td/><tr/><table/>') % \ |
||||
|
(self.customer_id.name, self.name, inv_id.amount_total, inv_id.date_due, inv_id.user_id.name, |
||||
|
inv_id.user_id.mobile) |
||||
|
main_content = { |
||||
|
'subject': "Reminder Recurrent Payment!", |
||||
|
'author_id': self.env.user.partner_id.id, |
||||
|
'body_html': mail_content, |
||||
|
'email_to': self.customer_id.email, |
||||
|
|
||||
|
} |
||||
|
self.env['mail.mail'].create(main_content).send() |
||||
|
else: |
||||
|
records.state = "checking" |
||||
|
|
||||
|
@api.multi |
||||
|
def action_verify(self): |
||||
|
self.state = "invoice" |
||||
|
if self.total_cost != 0: |
||||
|
inv_obj = self.env['account.invoice'] |
||||
|
inv_line_obj = self.env['account.invoice.line'] |
||||
|
supplier = self.customer_id |
||||
|
inv_data = { |
||||
|
'name': supplier.name, |
||||
|
'reference': supplier.name, |
||||
|
'account_id': supplier.property_account_payable_id.id, |
||||
|
'partner_id': supplier.id, |
||||
|
'currency_id': self.account_type.company_id.currency_id.id, |
||||
|
'journal_id': self.journal_type.id, |
||||
|
'origin': self.name, |
||||
|
'company_id': self.account_type.company_id.id, |
||||
|
'date_due': self.rent_end_date, |
||||
|
} |
||||
|
inv_id = inv_obj.create(inv_data) |
||||
|
product_id = self.env['product.product'].search([("name", "=", "Fleet Rental Service")]) |
||||
|
if product_id.property_account_income_id.id: |
||||
|
income_account = product_id.property_account_income_id |
||||
|
elif product_id.categ_id.property_account_income_categ_id.id: |
||||
|
income_account = product_id.categ_id.property_account_income_categ_id |
||||
|
else: |
||||
|
raise UserError( |
||||
|
_('Please define income account for this product: "%s" (id:%d).') % (product_id.name, |
||||
|
product_id.id)) |
||||
|
inv_line_data = { |
||||
|
'name': "Damage/Tools missing cost", |
||||
|
'account_id': income_account.id, |
||||
|
'price_unit': self.total_cost, |
||||
|
'quantity': 1, |
||||
|
'product_id': product_id.id, |
||||
|
'invoice_id': inv_id.id, |
||||
|
} |
||||
|
inv_line_obj.create(inv_line_data) |
||||
|
imd = self.env['ir.model.data'] |
||||
|
action = imd.xmlid_to_object('account.action_invoice_tree1') |
||||
|
list_view_id = imd.xmlid_to_res_id('account.invoice_tree') |
||||
|
form_view_id = imd.xmlid_to_res_id('account.invoice_form') |
||||
|
result = { |
||||
|
'name': action.name, |
||||
|
'help': action.help, |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'views': [[list_view_id, 'tree'], [form_view_id, 'form'], [False, 'graph'], [False, 'kanban'], |
||||
|
[False, 'calendar'], [False, 'pivot']], |
||||
|
'target': action.target, |
||||
|
'context': action.context, |
||||
|
'res_model': 'account.invoice', |
||||
|
} |
||||
|
if len(inv_id) > 1: |
||||
|
result['domain'] = "[('id','in',%s)]" % inv_id.ids |
||||
|
elif len(inv_id) == 1: |
||||
|
result['views'] = [(form_view_id, 'form')] |
||||
|
result['res_id'] = inv_id.ids[0] |
||||
|
else: |
||||
|
result = {'type': 'ir.actions.act_window_close'} |
||||
|
return result |
||||
|
|
||||
|
@api.multi |
||||
|
def action_confirm(self): |
||||
|
self.state = "running" |
||||
|
sequence_code = 'car.rental.sequence' |
||||
|
order_date = self.create_date |
||||
|
order_date = order_date[0:10] |
||||
|
self.name = self.env['ir.sequence']\ |
||||
|
.with_context(ir_sequence_date=order_date).next_by_code(sequence_code) |
||||
|
mail_content = _('<h3>Order Confirmed!</h3><br/>Hi %s, <br/> This is to notify that your rental contract has ' |
||||
|
'been confirmed. <br/><br/>' |
||||
|
'Please find the details below:<br/><br/>' |
||||
|
'<table><tr><td>Reference Number<td/><td> %s<td/><tr/>' |
||||
|
'<tr><td>Time Range <td/><td> %s to %s <td/><tr/><tr><td>Vehicle <td/><td> %s<td/><tr/>' |
||||
|
'<tr><td>Point Of Contact<td/><td> %s , %s<td/><tr/><table/>') % \ |
||||
|
(self.customer_id.name, self.name, self.rent_start_date, self.rent_end_date, |
||||
|
self.vehicle_id.name, self.sales_person.name, self.sales_person.mobile) |
||||
|
main_content = { |
||||
|
'subject': _('Confirmed: %s - %s') % |
||||
|
(self.name, self.vehicle_id.name), |
||||
|
'author_id': self.env.user.partner_id.id, |
||||
|
'body_html': mail_content, |
||||
|
'email_to': self.customer_id.email, |
||||
|
|
||||
|
} |
||||
|
self.env['mail.mail'].create(main_content).send() |
||||
|
|
||||
|
@api.multi |
||||
|
def action_cancel(self): |
||||
|
self.state = "cancel" |
||||
|
|
||||
|
@api.multi |
||||
|
def force_checking(self): |
||||
|
self.state = "checking" |
||||
|
|
||||
|
@api.multi |
||||
|
def action_view_invoice(self): |
||||
|
inv_obj = self.env['account.invoice'].search([('origin', '=', self.name)]) |
||||
|
inv_ids = [] |
||||
|
for each in inv_obj: |
||||
|
inv_ids.append(each.id) |
||||
|
view_id = self.env.ref('account.invoice_form').id |
||||
|
if inv_ids: |
||||
|
if len(inv_ids) <= 1: |
||||
|
value = { |
||||
|
'view_type': 'form', |
||||
|
'view_mode': 'form', |
||||
|
'res_model': 'account.invoice', |
||||
|
'view_id': view_id, |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'name': _('Invoice'), |
||||
|
'res_id': inv_ids and inv_ids[0] |
||||
|
} |
||||
|
else: |
||||
|
value = { |
||||
|
'domain': str([('id', 'in', inv_ids)]), |
||||
|
'view_type': 'form', |
||||
|
'view_mode': 'tree,form', |
||||
|
'res_model': 'account.invoice', |
||||
|
'view_id': False, |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'name': _('Invoice'), |
||||
|
'res_id': inv_ids |
||||
|
} |
||||
|
|
||||
|
return value |
||||
|
|
||||
|
@api.multi |
||||
|
def action_invoice_create(self): |
||||
|
for each in self: |
||||
|
rent_date = datetime.strptime(each.rent_start_date, "%Y-%m-%d").date() |
||||
|
if each.cost_frequency != 'no' and rent_date < date.today(): |
||||
|
rental_days = (date.today() - rent_date).days |
||||
|
for each1 in range(1, rental_days): |
||||
|
each.fleet_scheduler() |
||||
|
recurrent_obj = self.env.ref('fleet_rental.cron_scheduler_for_fleet') |
||||
|
if datetime.today() > datetime.strptime(recurrent_obj.nextcall, "%Y-%m-%d %H:%M:%S"): |
||||
|
each.fleet_scheduler() |
||||
|
|
||||
|
if self.first_payment != 0: |
||||
|
self.first_invoice_created = True |
||||
|
inv_obj = self.env['account.invoice'] |
||||
|
inv_line_obj = self.env['account.invoice.line'] |
||||
|
supplier = self.customer_id |
||||
|
inv_data = { |
||||
|
'name': supplier.name, |
||||
|
'reference': supplier.name, |
||||
|
'account_id': supplier.property_account_payable_id.id, |
||||
|
'partner_id': supplier.id, |
||||
|
'currency_id': self.account_type.company_id.currency_id.id, |
||||
|
'journal_id': self.journal_type.id, |
||||
|
'origin': self.name, |
||||
|
'company_id': self.account_type.company_id.id, |
||||
|
'date_due': self.rent_end_date, |
||||
|
} |
||||
|
inv_id = inv_obj.create(inv_data) |
||||
|
self.first_payment_inv = inv_id.id |
||||
|
product_id = self.env['product.product'].search([("name", "=", "Fleet Rental Service")]) |
||||
|
if product_id.property_account_income_id.id: |
||||
|
income_account = product_id.property_account_income_id.id |
||||
|
elif product_id.categ_id.property_account_income_categ_id.id: |
||||
|
income_account = product_id.categ_id.property_account_income_categ_id.id |
||||
|
else: |
||||
|
raise UserError( |
||||
|
_('Please define income account for this product: "%s" (id:%d).') % (product_id.name, |
||||
|
product_id.id)) |
||||
|
inv_line_data = { |
||||
|
'name': self.vehicle_id.name, |
||||
|
'account_id': income_account, |
||||
|
'price_unit': self.first_payment, |
||||
|
'quantity': 1, |
||||
|
'product_id': product_id.id, |
||||
|
'invoice_id': inv_id.id, |
||||
|
} |
||||
|
inv_line_obj.create(inv_line_data) |
||||
|
mail_content = _( |
||||
|
'<h3>First Payment Received!</h3><br/>Hi %s, <br/> This is to notify that your first payment has ' |
||||
|
'been received. <br/><br/>' |
||||
|
'Please find the details below:<br/><br/>' |
||||
|
'<table><tr><td>Contract Ref<td/><td> %s<td/><tr/>' |
||||
|
'<tr><td>Amount <td/><td> %s<td/><tr/><table/>') % \ |
||||
|
(self.customer_id.name, self.name, inv_id.amount_total) |
||||
|
main_content = { |
||||
|
'subject': _('Payment Received: %s') % inv_id.number, |
||||
|
'author_id': self.env.user.partner_id.id, |
||||
|
'body_html': mail_content, |
||||
|
'email_to': self.customer_id.email, |
||||
|
} |
||||
|
self.env['mail.mail'].create(main_content).send() |
||||
|
imd = self.env['ir.model.data'] |
||||
|
action = imd.xmlid_to_object('account.action_invoice_tree1') |
||||
|
list_view_id = imd.xmlid_to_res_id('account.invoice_tree') |
||||
|
form_view_id = imd.xmlid_to_res_id('account.invoice_form') |
||||
|
result = { |
||||
|
'name': action.name, |
||||
|
'help': action.help, |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'views': [[list_view_id, 'tree'], [form_view_id, 'form'], [False, 'graph'], [False, 'kanban'], |
||||
|
[False, 'calendar'], [False, 'pivot']], |
||||
|
'target': action.target, |
||||
|
'context': action.context, |
||||
|
'res_model': 'account.invoice', |
||||
|
} |
||||
|
if len(inv_id) > 1: |
||||
|
result['domain'] = "[('id','in',%s)]" % inv_id.ids |
||||
|
elif len(inv_id) == 1: |
||||
|
result['views'] = [(form_view_id, 'form')] |
||||
|
result['res_id'] = inv_id.ids[0] |
||||
|
else: |
||||
|
result = {'type': 'ir.actions.act_window_close'} |
||||
|
return result |
||||
|
else: |
||||
|
raise Warning("Please enter advance amount to make first payment") |
||||
|
|
||||
|
@api.onchange('vehicle_id') |
||||
|
def update_fields(self): |
||||
|
if self.vehicle_id: |
||||
|
obj = self.env['fleet.vehicle'].search([('name', '=', self.vehicle_id.name)]) |
||||
|
self.car_brand = obj.model_id.brand_id.name |
||||
|
self.car_color = obj.color |
||||
|
|
||||
|
|
||||
|
class FleetRentalLine(models.Model): |
||||
|
_name = 'fleet.rental.line' |
||||
|
|
||||
|
name = fields.Char('Description') |
||||
|
date_today = fields.Date('Date') |
||||
|
account_info = fields.Char('Account') |
||||
|
recurring_amount = fields.Float('Amount') |
||||
|
rental_number = fields.Many2one('car.rental.contract', string='Rental Number') |
||||
|
payment_info = fields.Char(string='Payment Stage', compute='paid_info') |
||||
|
invoice_number = fields.Integer(string='Invoice ID') |
||||
|
|
||||
|
@api.multi |
||||
|
@api.depends('payment_info') |
||||
|
def paid_info(self): |
||||
|
for each in self: |
||||
|
if self.env['account.invoice'].browse(each.invoice_number): |
||||
|
each.payment_info = self.env['account.invoice'].browse(each.invoice_number).state |
||||
|
else: |
||||
|
each.payment_info = 'Record Deleted' |
||||
|
|
||||
|
|
||||
|
class CarRentalChecklist(models.Model): |
||||
|
_name = 'car.rental.checklist' |
||||
|
|
||||
|
name = fields.Many2one('car.tools', string="Name") |
||||
|
checklist_active = fields.Boolean(string="Active", default=False) |
||||
|
checklist_number = fields.Many2one('car.rental.contract', string="Checklist number") |
||||
|
price = fields.Float(string="Price") |
||||
|
|
||||
|
@api.onchange('name') |
||||
|
def onchange_name(self): |
||||
|
self.price = self.name.price |
||||
|
|
||||
|
|
||||
|
class CarTools(models.Model): |
||||
|
_name = 'car.tools' |
||||
|
|
||||
|
name = fields.Char(string="Name") |
||||
|
price = fields.Float(string="Price") |
@ -0,0 +1,24 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2016-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Cybrosys(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
import rental_report |
||||
|
|
@ -0,0 +1,82 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from openerp import models, fields, tools |
||||
|
|
||||
|
|
||||
|
class FleetRentalReport(models.Model): |
||||
|
_name = "report.fleet.rental" |
||||
|
_description = "Fleet Rental Analysis" |
||||
|
_auto = False |
||||
|
|
||||
|
name = fields.Char(string="Name") |
||||
|
customer_id = fields.Many2one('res.partner') |
||||
|
vehicle_id = fields.Many2one('fleet.vehicle') |
||||
|
car_brand = fields.Char(string="Car Brand") |
||||
|
car_color = fields.Char(string="Car Color") |
||||
|
cost = fields.Float(string="Rent Cost") |
||||
|
rent_start_date = fields.Date(string="Rent Start Date") |
||||
|
rent_end_date = fields.Date(string="Rent End Date") |
||||
|
state = fields.Selection([('draft', 'Draft'), ('running', 'Running'), ('cancel', 'Cancel'), |
||||
|
('checking', 'Checking'), ('done', 'Done')], string="State") |
||||
|
cost_frequency = fields.Selection([('no', 'No'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), |
||||
|
('yearly', 'Yearly')], string="Recurring Cost Frequency") |
||||
|
total = fields.Float(string="Total(Tools)") |
||||
|
tools_missing_cost = fields.Float(string="Tools missing cost") |
||||
|
damage_cost = fields.Float(string="Damage cost") |
||||
|
damage_cost_sub = fields.Float(string="Damage cost") |
||||
|
total_cost = fields.Float(string="Total cost") |
||||
|
|
||||
|
_order = 'name desc' |
||||
|
|
||||
|
def _select(self): |
||||
|
select_str = """ |
||||
|
SELECT |
||||
|
(select 1 ) AS nbr, |
||||
|
t.id as id, |
||||
|
t.name as name, |
||||
|
t.car_brand as car_brand, |
||||
|
t.customer_id as customer_id, |
||||
|
t.vehicle_id as vehicle_id, |
||||
|
t.car_color as car_color, |
||||
|
t.cost as cost, |
||||
|
t.rent_start_date as rent_start_date, |
||||
|
t.rent_end_date as rent_end_date, |
||||
|
t.state as state, |
||||
|
t.cost_frequency as cost_frequency, |
||||
|
t.total as total, |
||||
|
t.tools_missing_cost as tools_missing_cost, |
||||
|
t.damage_cost as damage_cost, |
||||
|
t.damage_cost_sub as damage_cost_sub, |
||||
|
t.total_cost as total_cost |
||||
|
""" |
||||
|
return select_str |
||||
|
|
||||
|
def _group_by(self): |
||||
|
group_by_str = """ |
||||
|
GROUP BY |
||||
|
t.id, |
||||
|
name, |
||||
|
car_brand, |
||||
|
customer_id, |
||||
|
vehicle_id, |
||||
|
car_color, |
||||
|
cost, |
||||
|
rent_start_date, |
||||
|
rent_end_date, |
||||
|
state, |
||||
|
cost_frequency, |
||||
|
total, |
||||
|
tools_missing_cost, |
||||
|
damage_cost, |
||||
|
damage_cost_sub, |
||||
|
total_cost |
||||
|
""" |
||||
|
return group_by_str |
||||
|
|
||||
|
def init(self, cr): |
||||
|
tools.sql.drop_view_if_exists(cr, 'report_fleet_rental') |
||||
|
cr.execute(""" |
||||
|
CREATE view report_fleet_rental as |
||||
|
%s |
||||
|
FROM car_rental_contract t |
||||
|
%s |
||||
|
""" % (self._select(), self._group_by())) |
@ -0,0 +1,25 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
<record id="view_report_car_rental" model="ir.ui.view"> |
||||
|
<field name="name">report.fleet.rental.pivot</field> |
||||
|
<field name="model">report.fleet.rental</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<pivot string="Fleet Rental Analysis" display_quantity="true" disable_linking="True"> |
||||
|
<field name="name" type="row"/> |
||||
|
</pivot> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_fleet_rental_analysis" model="ir.actions.act_window"> |
||||
|
<field name="name">Fleet Rental Analysis</field> |
||||
|
<field name="res_model">report.fleet.rental</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">pivot</field> |
||||
|
<field name="context">{'group_by_no_leaf':1,'group_by':[]}</field> |
||||
|
<field name="help">This report allows you to analyse the performance of your Fleet Rental. </field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem name="Fleet Rental Analysis" action="action_fleet_rental_analysis" id="menu_fleet_rental_analysis" parent="fleet.menu_fleet_reporting" sequence="1"/> |
||||
|
</data> |
||||
|
</openerp> |
Can't render this file because it contains an unexpected character in line 15 and column 58.
|
@ -0,0 +1,18 @@ |
|||||
|
<?xml version="1.0" ?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
<record id="rental_group_user" model="res.groups"> |
||||
|
<field name="name">Rental User</field> |
||||
|
<field name="category_id" ref="fleet.module_fleet_category"/> |
||||
|
<field name="implied_ids" eval="[(4, ref('base.group_user')), (4, ref('fleet.group_fleet_user')), |
||||
|
(4, ref('account.group_account_user'))]"/> |
||||
|
</record> |
||||
|
|
||||
|
<record id="fleet.group_fleet_manager" model="res.groups"> |
||||
|
<field name="name">Manager</field> |
||||
|
<field name="implied_ids" eval="[(4, ref('fleet.group_fleet_user')), (4, ref('rental_group_user'))]"/> |
||||
|
<field name="category_id" ref="fleet.module_fleet_category"/> |
||||
|
<field name="users" eval="[(4, ref('base.user_root'))]"/> |
||||
|
</record> |
||||
|
</data> |
||||
|
</openerp> |
After Width: | Height: | Size: 137 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 66 KiB |
@ -0,0 +1,228 @@ |
|||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan">Fleet/Vehicle Rental Management</h2> |
||||
|
<h3 class="oe_slogan">This module helps with an opportunity to give the vehicles for Rent.</h3> |
||||
|
<h4 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a> </h4> |
||||
|
</div> |
||||
|
<div class="oe_row oe_spaced" style="padding-left:65px;"> |
||||
|
<h4>Features:</h4> |
||||
|
<div> |
||||
|
<span style="color:green;"> ☑ </span> Multiple Plans for Rental Contract(Days/Weeks/Months/Years).<br/> |
||||
|
<span style="color:green;"> ☑ </span> Integrated with Accounting Module.<br/> |
||||
|
<span style="color:green;"> ☑ </span> Automatically Create Recurring Invoices.<br/> |
||||
|
<span style="color:green;"> ☑ </span> Sending email for confirmation, first payment and recurrent invoices.<br/> |
||||
|
<span style="color:green;"> ☑ </span> Check List Facility.<br/> |
||||
|
<span style="color:green;"> ☑ </span> Separate Tree view for Checklist.<br/> |
||||
|
<span style="color:green;"> ☑ </span> Damage Checking Facility.<br/> |
||||
|
<span style="color:green;"> ☑ </span> Billing Facility for Damages/Check Lists.<br/> |
||||
|
<span style="color:green;"> ☑ </span> Contract Payment Validations.<br/> |
||||
|
<span style="color:green;"> ☑ </span> Detailed Fleet Rental Analysis Report.<br/> |
||||
|
<span style="color:green;"> ☑ </span> Access Rights From Multiple Level.<br/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<div class="oe_picture"> |
||||
|
<h3 class="oe_slogan">Overview</h3> |
||||
|
<p class="oe_mt32" style="text-align: center;"> |
||||
|
This module is an application for Vehicle Rental System by Cybrosys Technologies which helps in managing the rental of fleet/vehicle. |
||||
|
It manages fleet/vehicle property by extending the basic fleet module of Odoo. |
||||
|
Currently fleet module does not have any connection with accounting module. But in this module, |
||||
|
we integrate the module with accounting also. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h3 class="oe_slogan">Fleet Rental Management</h3> |
||||
|
<div style="text-align: center"> |
||||
|
<p> |
||||
|
<h4>Fleet Rental -> Rental Management</h4> |
||||
|
<p> |
||||
|
</div> |
||||
|
<div style="text-align: center"> |
||||
|
<a href="https://www.cybrosys.com"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;height: 400px;" src="menu_items.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
<span style="text-align: center;padding-left:65px;">☛ When you install the module, an extra menu named Rental Management is created |
||||
|
under the Fleet Menu. Also "Fleet" menu is replaced as "Fleet Rental". Here you can see different color |
||||
|
codes according to each state. This helps you in finding out contracts easily.</span> |
||||
|
</div> |
||||
|
<br> |
||||
|
<div class="" style="text-align: center"> |
||||
|
<div class="" style="text-align: center"> |
||||
|
<p> |
||||
|
<h4>Fleet Rental -> Rental Management -> Rental Contract</h4> |
||||
|
<p> |
||||
|
</div> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;" src="contract_menu.png"> |
||||
|
</div> |
||||
|
<div style="padding-left:65px;"> |
||||
|
<span>☛ This is the Rental Contract form. You can see the Recurring lines created according to |
||||
|
the Recurring cost. And also you can see all the invoices related to this contract from the smart |
||||
|
button "Invoices".</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h3 class="oe_slogan">Checklist</h3> |
||||
|
<div class="" style="text-align: center"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;height: 400px;" src="checklist_contract.png"> |
||||
|
</div> |
||||
|
<span>☛ Checklist Tab in Rental Contract Form.</span> |
||||
|
</div> |
||||
|
<br> |
||||
|
<div class="" style="text-align: center"> |
||||
|
<div class="" style="text-align: center;padding-left:65px;"> |
||||
|
<p> |
||||
|
Here you can add the list of tools given with the vehicle. |
||||
|
When the vehicle is returned back, the checklist can be validated and helps you to identify the |
||||
|
tools that are not returned. The price of unreturned tools will be added to the missing tool cost. |
||||
|
The renter have to pay that amount and you can also add damage cost if any. Check the damages by |
||||
|
using the images of vehicle uploaded before the contract. |
||||
|
<p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h3 class="oe_slogan">Checklist Easy Access</h3> |
||||
|
<div style="text-align: center"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;" src="check_list_tree.png"> |
||||
|
</div> |
||||
|
<span style="text-align: center">☛ No need to open all rental contract to see the checklist.</span> |
||||
|
</div> |
||||
|
<div class="" style="text-align: center"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;" src="check_list_form.png"> |
||||
|
</div> |
||||
|
<div style="padding-left:65px;"> |
||||
|
<span> |
||||
|
You can also create invoice against the checklist from here. |
||||
|
The checklists are those which are in the checking state, |
||||
|
that means the ones ready for checking the operation. |
||||
|
If there is any damage or any missing tool, then you can charge all that from customer.</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h3 class="oe_slogan">Email Notifications</h3> |
||||
|
<div class=""> |
||||
|
<div style="padding-left:65px;"> |
||||
|
<span> |
||||
|
☛The system will send email notification to notify the confirmation of contract.<br/> |
||||
|
☛The system will notify the first payment through email.<br/> |
||||
|
☛The system will remind all recurrent invoices through email.<br/> |
||||
|
<I>Note:- You should configure outgoing and incoming e-mail settings from your odoo for email service.</I> |
||||
|
</span> |
||||
|
</div> |
||||
|
<div class="oe_span12"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;height:400px;" src="email3.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="oe_span12"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;height:400px;" src="email2.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="oe_span12"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;height:400px;" src="email1.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h3 class="oe_slogan">Contract Payment Validations</h3> |
||||
|
<div class="" style="text-align: center"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;height:400px;" src="rental_inv.png"> |
||||
|
</div> |
||||
|
<div style="padding-left:65px;"> |
||||
|
<span>☛ |
||||
|
Here you can see you have 4 invoices and this contract is in 'Invoice' state. |
||||
|
So you can set this contract to done only if all the invoices are in 'paid' state. |
||||
|
Otherwise it will raise a warning as follow. |
||||
|
</span> |
||||
|
|
||||
|
</div> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;height:400px;" src="rental_validation.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h3 class="oe_slogan">Fleet Rental Analysis Report</h3> |
||||
|
<div class="" style="text-align: center"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;height:400px;" src="report.png"> |
||||
|
</div> |
||||
|
<span>☛ |
||||
|
You can also analyse all your fleet rentals from Fleet Rental -> Reports -> Fleet Rental Analysis. |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h3 class="oe_slogan">Access Rights</h3> |
||||
|
<div class="" style="padding-left:65px;"> |
||||
|
<span>☛Fleet Manager :- Fleet manager has the complete access across the fleet rental management <br/></span> |
||||
|
<span>☛Fleet Rental User :- Fleet rental user can read, write and create the records.</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2> |
||||
|
<div class="oe_slogan" style="margin-top:10px !important;"> |
||||
|
<div> |
||||
|
<a class="btn btn-primary btn-lg mt8" |
||||
|
style="color: #FFFFFF !important;border-radius: 0;" href="http://www.cybrosys.com"><i |
||||
|
class="fa fa-envelope"></i> Email </a> <a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="http://www.cybrosys.com/contact/"><i |
||||
|
class="fa fa-phone"></i> Contact Us </a> <a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="http://www.cybrosys.com/odoo-customization-and-installation/"><i |
||||
|
class="fa fa-check-square"></i> Request Customization </a> |
||||
|
</div> |
||||
|
<br> |
||||
|
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
||||
|
<div> |
||||
|
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;"></i></a></td> |
||||
|
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;"></i></a></td> |
||||
|
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px;padding-left: 8px;"></i></a></td> |
||||
|
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;"></i></a></td> |
||||
|
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;"></i></a></td> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
|
||||
|
|
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 109 KiB |
@ -0,0 +1,206 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<openerp> |
||||
|
<data noupdate="1"> |
||||
|
<record id="sequence_car_rental" model="ir.sequence"> |
||||
|
<field name="name">Car Rental Sequence</field> |
||||
|
<field name="code">car.rental.sequence</field> |
||||
|
<field name="prefix">RENT/%(range_year)s/</field> |
||||
|
<field eval="1" name="number_next"/> |
||||
|
<field eval="1" name="number_increment"/> |
||||
|
<field eval="True" name="use_date_range"/> |
||||
|
<field name="padding">4</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
|
||||
|
<data> |
||||
|
<record id="cron_scheduler_for_fleet" model="ir.cron"> |
||||
|
<field name="name">Fleet scheduler</field> |
||||
|
<field name="user_id" ref="base.user_root"/> |
||||
|
<field name="interval_number">1</field> |
||||
|
<field name="interval_type">days</field> |
||||
|
<field name="numbercall">-1</field> |
||||
|
<field eval="False" name="doall"/> |
||||
|
<field eval="'car.rental.contract'" name="model"/> |
||||
|
<field eval="'fleet_scheduler'" name="function"/> |
||||
|
</record> |
||||
|
|
||||
|
<record id="car_rental_contract_form_view" model="ir.ui.view"> |
||||
|
<field name="name">car.contract.result.form</field> |
||||
|
<field name="model">car.rental.contract</field> |
||||
|
<field name="type">form</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="car_result"> |
||||
|
<header> |
||||
|
<button name="action_confirm" string="Confirm" type="object" |
||||
|
attrs="{'invisible': [('state', '!=', 'draft')]}" class="oe_highlight"/> |
||||
|
<button name="action_cancel" string="Cancel" type="object" |
||||
|
attrs="{'invisible': [('state', '!=', 'draft')]}" class="oe_highlight"/> |
||||
|
<button name="action_invoice_create" string="Create Invoice" |
||||
|
attrs="{'invisible': ['|',('state', '!=', 'running'), |
||||
|
('first_invoice_created','=',True)]}" type="object" class="oe_highlight"/> |
||||
|
<button name="force_checking" string="Force Checking" |
||||
|
attrs="{'invisible': ['|',('state','!=','running'), |
||||
|
('first_invoice_created','=',False)]}" type="object" class="oe_highlight"/> |
||||
|
<button name="set_to_done" string="Set to Done" |
||||
|
states="invoice" type="object" class="oe_highlight"/> |
||||
|
<field name="state" widget="statusbar" statusbar_visible="draft,running,done"/> |
||||
|
</header> |
||||
|
<sheet> |
||||
|
<div class="oe_right oe_button_box" style="width: 300px;" name="buttons"> |
||||
|
<button name='action_view_invoice' class="oe_stat_button" type="object" icon="fa-money"> |
||||
|
<field string="Invoice" name="invoice_count" widget="statinfo" /> |
||||
|
</button> |
||||
|
</div> |
||||
|
<field name="image_medium" widget='image' class="oe_avatar"/> |
||||
|
<div class="oe_title"> |
||||
|
<h1> |
||||
|
<field name="name"/> |
||||
|
</h1> |
||||
|
</div> |
||||
|
<group> |
||||
|
<separator string="Contract Details " colspan="4" /> |
||||
|
<group> |
||||
|
<field name="customer_id" string="Customer" |
||||
|
attrs="{'readonly': [('state','!=','draft')]}"/> |
||||
|
<field name="vehicle_id" domain="[('state_id', 'not in', ('Rent', 'Sold', 'Inactive'))]" |
||||
|
attrs="{'readonly': [('state','!=','draft')]}" widget="selection"/> |
||||
|
<label for="cost_generated"/> |
||||
|
<div> |
||||
|
<field name="cost_frequency" class="oe_inline" |
||||
|
attrs="{'readonly': [('state','!=','draft')]}"/> |
||||
|
<field name="cost_generated" style="width:142px;" |
||||
|
attrs="{'invisible': [('cost_frequency','=','no')], |
||||
|
'readonly': [('state','!=','draft')]}"/> |
||||
|
|
||||
|
</div> |
||||
|
<field name="journal_type" invisible="1" /> |
||||
|
<field name="sales_person" attrs="{'readonly': [('state','!=','draft')]}"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="car_brand" attrs="{'readonly': [('state','!=','draft')]}"/> |
||||
|
<field name="car_color" attrs="{'readonly': [('state','!=','draft')]}"/> |
||||
|
<field name="first_invoice_created" invisible="1"/> |
||||
|
<label for="first_payment"/> |
||||
|
<div> |
||||
|
<field name="first_payment" class="oe_inline" |
||||
|
attrs="{'readonly': ['|', ('state','not in',('draft', 'running')), |
||||
|
('first_invoice_created','=',True)]}"/> |
||||
|
<field name="first_payment_inv" style="width:142px;" readonly="1"/> |
||||
|
</div> |
||||
|
<field name="account_type" invisible="1"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<group> |
||||
|
<separator string="Rental Information"/> |
||||
|
<group colspan="2"> |
||||
|
<group> |
||||
|
<field name="rent_start_date" attrs="{'readonly': [('state','!=','draft')]}"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="rent_end_date" attrs="{'readonly': [('state','=','done')]}"/> |
||||
|
<field name="cost" invisible="1"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</group> |
||||
|
<notebook> |
||||
|
<page string="Recurring Invoices"> |
||||
|
<field name="recurring_line" mode="tree"> |
||||
|
<tree string="Fleet Reccurring Lines" |
||||
|
colors="#0b7a35:payment_info=='paid';#f20b07:payment_info!='paid'"> |
||||
|
<field name="date_today"/> |
||||
|
<field name="name"/> |
||||
|
<field name="account_info"/> |
||||
|
<field name="recurring_amount"/> |
||||
|
<field name="payment_info"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</page> |
||||
|
<page string="Checklist"> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="attachment_ids" widget="many2many_binary" class="oe_inline"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="damage_cost" |
||||
|
attrs="{'invisible': [('state','!=','checking')]}"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<field name="checklist_line"> |
||||
|
<tree string="Fleet Checklist Lines" editable="bottom"> |
||||
|
<field name="name"/> |
||||
|
<field name="checklist_active"/> |
||||
|
<field name="price"/> |
||||
|
</tree> |
||||
|
<form> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<field name="name"/> |
||||
|
<field name="checklist_active" invisible="1"/> |
||||
|
<field name="checklist_number" invisible="1"/> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
<div> |
||||
|
<group class="oe_subtotal_footer oe_right"> |
||||
|
<field name="total"/> |
||||
|
<field name="tools_missing_cost"/> |
||||
|
<field name="damage_cost_sub"/> |
||||
|
<field name="total_cost" class="oe_subtotal_footer_separator"/> |
||||
|
</group> |
||||
|
</div> |
||||
|
<div style="float: right;margin-left: 78%;margin-bottom: 36px;"> |
||||
|
<button name="action_verify" string="Verify" type="object" |
||||
|
style="width: 100px !important;height: 40px;" |
||||
|
attrs="{'invisible': [('state', '!=', 'checking')]}" |
||||
|
class="oe_subtotal_footer oe_right oe_highlight"/> |
||||
|
</div> |
||||
|
</page> |
||||
|
</notebook> |
||||
|
<group> |
||||
|
<field name="notes"/> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
<div class="oe_chatter"> |
||||
|
<field name="message_follower_ids" widget="mail_followers"/> |
||||
|
<field name="message_ids" widget="mail_thread"/> |
||||
|
</div> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="car_contract_tree_view"> |
||||
|
<field name="name">car_contract_tree_view.tree</field> |
||||
|
<field name="model">car.rental.contract</field> |
||||
|
<field name="type">tree</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="car_contract_result" decoration-info="state == 'draft'" colors="grey:state == 'done'; |
||||
|
green:state == 'running';red:state == 'checking';black:state == 'invoice';"> |
||||
|
<field name="name"/> |
||||
|
<field name="customer_id" string="Customer"/> |
||||
|
<field name="vehicle_id"/> |
||||
|
<field name="cost"/> |
||||
|
<field name="car_brand" /> |
||||
|
<field name="car_color" /> |
||||
|
<field name="rent_start_date"/> |
||||
|
<field name="rent_end_date"/> |
||||
|
<field name="state"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_car_rental_contract" model="ir.actions.act_window"> |
||||
|
<field name="name">Rental Contract</field> |
||||
|
<field name="res_model">car.rental.contract</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="domain">[('sales_person','=', uid)]</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem name="Fleet Rental" id="fleet.menu_root" sequence="115" groups="fleet.group_fleet_user" |
||||
|
web_icon="fleet,static/description/icon.png"/> |
||||
|
<menuitem id="menu_car_parent" sequence="1" name="Rental Management" parent="fleet.menu_root"/> |
||||
|
<menuitem id="menu_car_rental_contract" parent="menu_car_parent" name="Rental Contract" |
||||
|
action="action_car_rental_contract" sequence="1"/> |
||||
|
</data> |
||||
|
</openerp> |
@ -0,0 +1,46 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
<record id="car_rental_contract_tools_form_view" model="ir.ui.view"> |
||||
|
<field name="name">car_rental_contract_tools_form_view.form</field> |
||||
|
<field name="model">car.tools</field> |
||||
|
<field name="type">form</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="car_tools_form"> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="name"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="price"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="car_rental_contract_tools_tree_view" model="ir.ui.view"> |
||||
|
<field name="name">car_rental_contract_tools_tree_view.tree</field> |
||||
|
<field name="model">car.tools</field> |
||||
|
<field name="type">tree</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="car_tools_tree"> |
||||
|
<field name="name"/> |
||||
|
<field name="price"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_fleet_car_tools" model="ir.actions.act_window"> |
||||
|
<field name="name">Tools</field> |
||||
|
<field name="res_model">car.tools</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem id="menu_car_tools" parent="menu_car_parent" name="Tools" |
||||
|
action="action_fleet_car_tools" sequence="3"/> |
||||
|
</data> |
||||
|
</openerp> |
@ -0,0 +1,88 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
<record id="car_rental_contract_checklist_form_view" model="ir.ui.view"> |
||||
|
<field name="name">car_rental_contract_checklist_form_view.form</field> |
||||
|
<field name="model">car.rental.contract</field> |
||||
|
<field name="type">form</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="car_checklist2" create="false"> |
||||
|
<header> |
||||
|
<button name="action_verify" string="Create invoice" type="object" |
||||
|
attrs="{'invisible': [('state', '!=', 'checking')]}" class="oe_highlight"/> |
||||
|
<field name="state" widget="statusbar" statusbar_visible="checking"/> |
||||
|
</header> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="name" string="Contract" readonly="1"/> |
||||
|
<field name="attachment_ids" widget="many2many_binary" class="oe_inline" readonly="1"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="damage_cost"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<notebook> |
||||
|
<page string="Checklist"> |
||||
|
<field name="checklist_line"> |
||||
|
<tree string="Fleet Checklist Lines" create="false" editable="bottom"> |
||||
|
<field name="name"/> |
||||
|
<field name="checklist_active"/> |
||||
|
<field name="price"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
<div> |
||||
|
<group class="oe_subtotal_footer oe_right"> |
||||
|
<field name="total"/> |
||||
|
<field name="tools_missing_cost"/> |
||||
|
<field name="damage_cost_sub"/> |
||||
|
<field name="total_cost" class="oe_subtotal_footer_separator"/> |
||||
|
</group> |
||||
|
</div> |
||||
|
</page> |
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="car_rental_contract_checklist_tree_view" model="ir.ui.view"> |
||||
|
<field name="name">car_rental_contract_checklist_tree_view.tree</field> |
||||
|
<field name="model">car.rental.contract</field> |
||||
|
<field name="type">tree</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="car_contract_result2" create="false" colors="#f20b07:state=='checking';green:state=='running'" decoration-info="state == 'draft'"> |
||||
|
<field name="name" string="Contract"/> |
||||
|
<field name="name" string="Renter"/> |
||||
|
<field name="state"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_fleet_rent_checklist" model="ir.actions.act_window"> |
||||
|
<field name="name">Checklist</field> |
||||
|
<field name="res_model">car.rental.contract</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="domain">[('state', 'in', ('running', 'checking')), ('sales_person','=', uid)]</field> |
||||
|
<field name="view_id" ref="car_rental_contract_checklist_form_view"/> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_fleet_rent_checklist_form" model="ir.actions.act_window.view"> |
||||
|
<field eval="2" name="sequence"/> |
||||
|
<field name="view_mode">form</field> |
||||
|
<field name="view_id" ref="car_rental_contract_checklist_form_view"/> |
||||
|
<field name="act_window_id" ref="action_fleet_rent_checklist"/> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_fleet_rent_checklist_tree" model="ir.actions.act_window.view"> |
||||
|
<field eval="1" name="sequence"/> |
||||
|
<field name="view_mode">tree</field> |
||||
|
<field name="view_id" ref="car_rental_contract_checklist_tree_view"/> |
||||
|
<field name="act_window_id" ref="action_fleet_rent_checklist"/> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem id="menu_car_checklist" parent="menu_car_parent" name="Checklist" |
||||
|
action="action_fleet_rent_checklist" sequence="2"/> |
||||
|
</data> |
||||
|
</openerp> |