@ -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> |