Files
rental-tools/product_rental_inspection/models/product_inspection.py
2022-04-19 12:29:34 +02:00

139 lines
5.1 KiB
Python
Executable File

# -*- coding: utf-8 -*-
from datetime import date
from odoo import models, fields, api, _
class RentalProductInspection(models.Model):
_name = "rental.product.inspection"
_description = "Product Inspection"
_rec_name = "ref_number"
product_id = fields.Many2one("product.product", string="Product")
ref_number = fields.Char(string="Reference Number", default="New")
customer_id = fields.Many2one("res.partner", string="Customer")
location_id = fields.Many2one("stock.location", string="Location")
phone = fields.Char(string="Phone Number")
responsible_person_id = fields.Many2one("hr.employee", string="Responsible")
source_document = fields.Char(string="Source Document")
date = fields.Datetime(string="Date", default=lambda self: fields.Datetime.now())
state = fields.Selection(
[("ready", "Ready"), ("pause", "Paused"), ("done", "Done")], default="ready"
)
delayed_line_ids = fields.One2many(
"product.delayed", "inspection_id", string="Delayed Lines"
)
company_id = fields.Many2one(
"res.company", string="Company", default=lambda self: self.env.user.company_id
)
total_delayed_amount = fields.Float(string="Delayed Amount", readonly=True)
total_fuel_charged = fields.Float(string="Fuel Charged Amount")
currency_id = fields.Many2one("res.currency", related="company_id.currency_id")
def create_invoice(self):
inv_obj = self.env["account.move"]
total_amount = 0
invoice_line_data = []
account_id = self.env["account.account"].search(
[("code", "like", "708000"), ("company_id", "=", self.company_id.id)]
)
if not account_id:
user_type_id = self.env.ref("account.data_account_type_revenue")
account_id = self.env["account.account"].create(
{
"code": "708000",
"name": "Location",
"company_id": self.company_id.id,
"user_type_id": user_type_id.id,
}
)
for each_delay in self.delayed_line_ids:
if each_delay.invoice_state == "draft" and each_delay.delayed_amount > 0:
total_amount += each_delay.delayed_amount
invoice_line_data.append(
(
0,
0,
{
"product_id": self.product_id.id,
"name": "Delay Charge Invoice " + self.ref_number,
"account_id": account_id.id,
"price_unit": each_delay.delayed_amount,
"quantity": 1,
},
)
)
each_delay.invoice_state = "to_invoice"
if total_amount > 0:
invoice = inv_obj.create(
{
"ref": self.ref_number,
"invoice_origin": self.ref_number,
"partner_id": self.customer_id.id,
"move_type": "out_invoice",
"invoice_date": date.today(),
"invoice_line_ids": invoice_line_data,
}
)
invoice.action_post()
if invoice:
return {
"name": _("Account Move"),
"view_mode": "form",
"view_id": self.env.ref("account.view_move_form").id,
"view_type": "tree,form",
"res_model": "account.move",
"type": "ir.actions.act_window",
"res_id": invoice.id,
}
@api.model
def default_get(self, vals):
res = super(RentalProductInspection, self).default_get(vals)
sequence = self.env["ir.sequence"].next_by_code("product_inspection") or _(
"Product Inspection"
)
if self._context.get("active_model") == "stock.picking":
res.update(
{
"ref_number": sequence,
}
)
return res
@api.onchange("customer_id")
def onchange_filter_product(self):
if self._context.get("product_list"):
return {
"domain": {
"product_id": [("id", "in", self._context.get("product_list"))]
}
}
def done(self):
self.state = "done"
def pause(self):
self.state = "pause"
def resume(self):
self.state = "ready"
class ProductDelayed(models.Model):
_name = "product.delayed"
_description = "Product Delayed"
inspection_id = fields.Many2one("rental.product.inspection", string="Inspection")
name = fields.Char(string="Description")
product_id = fields.Many2one("product.product", string="Product Name")
delay_cost_per_hour = fields.Float(string="Cost/Hour")
delayed_hours = fields.Float(string="Total Hours")
delayed_amount = fields.Float(string="Delayed Amount")
invoice_state = fields.Selection(
[("draft", "Draft"), ("to_invoice", "To Invoice")], default="draft"
)