You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
10 KiB
226 lines
10 KiB
# -*- coding: utf-8 -*-
|
|
##############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
|
|
# Author: Risvana A R (odoo@cybrosys.com)
|
|
# you can modify it under the terms of the GNU AFFERO
|
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
# GENERAL PUBLIC LICENSE (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
##############################################################################
|
|
import json
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class LaundryOrder(models.Model):
|
|
""" This class is inherited for model laundry_order.
|
|
It contains fields and the functions for the model
|
|
|
|
Methods:
|
|
_compute_amount_all(self):
|
|
Action perform to computing the total amounts of the LaundryOrder.
|
|
|
|
_compute_tax_totals_json(self):
|
|
Action perform to computing the total tax amount using the order-lines tax and amount.
|
|
|
|
_invoice_count(self):
|
|
Action perform to computing the invoice count based on the particular Laundry order.
|
|
|
|
_work_count(self):
|
|
Action perform to computing the work count based on the particular Laundry order.
|
|
|
|
action_view_laundry_works(self):
|
|
Action perform to works details of the LaundryOrder , the laundry work smart button views are displayed.
|
|
|
|
action_view_invoice(self):
|
|
Action perform to Invoice details of the LaundryOrder when opening the smart button we can view the invoice details.
|
|
"""
|
|
_inherit = 'laundry.order'
|
|
|
|
order_ref = fields.Char(string='Order Ref',
|
|
help='Reference field for order')
|
|
pos_reference = fields.Char(string='Receipt Number',
|
|
help='Reference field for POS')
|
|
is_invoiced = fields.Boolean(string='Is Invoiced', invisible=1,
|
|
help='Boolean field for checking and '
|
|
'adding the invoices')
|
|
pos_order = fields.Boolean(string='Is POS order',
|
|
help='Boolean field for pos order '
|
|
'identification')
|
|
pos_order_id = fields.Many2one('pos.order', string='POS order',
|
|
help='Relating the many2one field for pos.order')
|
|
tax_totals_json = fields.Char(compute='_compute_tax_totals_json',
|
|
help='For computing the tax ')
|
|
amount_untaxed = fields.Monetary(string='Untaxed Amount',
|
|
compute='_compute_amount_all',
|
|
help='For computing the untaxed amount')
|
|
amount_tax = fields.Monetary(string='Taxes', compute='_compute_amount_all',
|
|
help='Compute the tax amounts')
|
|
total_amount = fields.Monetary(string='Total', store=True,
|
|
compute='_compute_amount_all',
|
|
help='Compute the total amount')
|
|
|
|
@api.depends('order_lines')
|
|
def _compute_amount_all(self):
|
|
"""
|
|
Compute the total amounts of the LaundryOrder.
|
|
"""
|
|
for order in self:
|
|
amount_untaxed = amount_tax = 0.0
|
|
for line in order.order_lines:
|
|
amount_untaxed += line.amount
|
|
amount_tax += line.price_tax
|
|
order.update({
|
|
'amount_untaxed': amount_untaxed,
|
|
'amount_tax': amount_tax,
|
|
'total_amount': amount_untaxed + amount_tax,
|
|
})
|
|
|
|
@api.depends('order_lines.tax_ids', 'order_lines.amount',
|
|
'total_amount')
|
|
def _compute_tax_totals_json(self):
|
|
""" computing the total tax amount using the order-lines
|
|
tax and amount"""
|
|
def compute_taxes(order_lines):
|
|
price = order_lines.amount
|
|
orders = order_lines.laundry_obj
|
|
return order_lines.tax_ids._origin.compute_all(price,
|
|
orders.currency_id,
|
|
product=
|
|
order_lines.product_id,
|
|
partner=
|
|
orders.partner_shipping_id)
|
|
|
|
for order in self:
|
|
tax_lines_data = self.env['account.move']._prepare_tax_lines_data_for_totals_from_object(
|
|
order.order_lines, compute_taxes)
|
|
tax_totals = self.env['account.move']._get_tax_totals(
|
|
order.partner_id, tax_lines_data, order.order_lines.amount,
|
|
order.total_amount, order.currency_id)
|
|
order.tax_totals_json = json.dumps(tax_totals)
|
|
|
|
def _invoice_count(self):
|
|
"""Computing the invoice count based on the particular Laundry order
|
|
override the _invoice_count function"""
|
|
work = self.env['pos.order'].search(
|
|
[('name', '=', self.order_ref)])
|
|
if not work:
|
|
wrk_ordr_ids = self.env['account.move'].search([('invoice_origin', '=',
|
|
self.sale_obj.name)])
|
|
self.invoice_count = len(wrk_ordr_ids)
|
|
else:
|
|
work_orders = self.env['account.move'].search([('invoice_origin',
|
|
'=', work.name)])
|
|
self.invoice_count = len(work_orders)
|
|
self.is_invoiced = True
|
|
|
|
def _work_count(self):
|
|
"""Computing the work count based on the particular Laundry order
|
|
override the _work_count function"""
|
|
work = self.env['pos.order'].search(
|
|
[('name', '=', self.order_ref)])
|
|
if not work:
|
|
if self.id:
|
|
wrk_ordr_ids = self.env['washing.washing'].search([('laundry_obj.laundry_obj.id', '=', self.id)])
|
|
self.work_count = len(wrk_ordr_ids)
|
|
else:
|
|
self.work_count = False
|
|
else:
|
|
self.work_count = len(work.lines)
|
|
|
|
def action_view_laundry_works(self):
|
|
"""
|
|
works details of the LaundryOrder , the laundry work
|
|
smart button views are displayed here.
|
|
"""
|
|
result = super().action_view_laundry_works()
|
|
pos_orders = self.env['pos.order'].search(
|
|
[('name', '=', self.order_ref)])
|
|
pos_order_ids = pos_orders.mapped('id')
|
|
view_id = self.env.ref('laundry_management.washing_form_view').id
|
|
if pos_orders and len(pos_orders.lines) <= 1:
|
|
return {
|
|
'view_type': 'form',
|
|
'view_mode': 'form',
|
|
'res_model': 'washing.washing',
|
|
'view_id': view_id,
|
|
'type': 'ir.actions.act_window',
|
|
'name': _('Works'),
|
|
'res_id': pos_order_ids and pos_order_ids[0]
|
|
}
|
|
|
|
return result
|
|
|
|
def action_view_invoice(self):
|
|
"""
|
|
Invoice details of the LaundryOrder when opening the smart button
|
|
we can view the invoice details.
|
|
"""
|
|
result = super(LaundryOrder, self).action_view_invoice()
|
|
work = self.env['pos.order'].search(
|
|
[('name', '=', self.order_ref)])
|
|
invoice = self.env['account.move'].search(
|
|
[('invoice_origin', '=', work.name)])
|
|
invoice_ids = invoice.mapped('id')
|
|
view_id = self.env.ref('account.view_move_form').id
|
|
if invoice and len(invoice_ids) <= 1:
|
|
return {
|
|
'view_type': 'form',
|
|
'view_mode': 'form',
|
|
'res_model': 'account.move',
|
|
'view_id': view_id,
|
|
'type': 'ir.actions.act_window',
|
|
'name': _('Invoice'),
|
|
'res_id': invoice_ids and invoice_ids[0]
|
|
}
|
|
return result
|
|
|
|
|
|
class LaundryOrderLine(models.Model):
|
|
""" This class is inherited for model laundry_order_line.
|
|
It contains fields and the functions for the model
|
|
|
|
Methods:
|
|
_compute_price_tax(self):
|
|
Action perform to compute the subtotal amounts of the LaundryOrder line.
|
|
|
|
"""
|
|
_inherit = 'laundry.order.line'
|
|
|
|
# washing_type field is updated with the module Laundry Management
|
|
washing_type = fields.Many2one('washing.type', string='Washing Type',
|
|
required=False,
|
|
help='The many2one field for relating'
|
|
' to the washing type')
|
|
tax_ids = fields.Many2many('account.tax', string='Taxes',
|
|
help='The many2one field for relating to '
|
|
'the account tax')
|
|
price_tax = fields.Float(compute='_compute_price_tax', string='Total Tax',
|
|
help='The compute field for calculating price '
|
|
'tax')
|
|
|
|
@api.depends('qty', 'washing_type', 'extra_work', 'tax_ids')
|
|
def _compute_price_tax(self):
|
|
"""
|
|
Compute the amounts of the LaundryOrder line ie used to calculate subtotal amount with the quantity of product and the washing types.
|
|
"""
|
|
for line in self:
|
|
price = line.washing_type.amount
|
|
taxes = line.tax_ids.compute_all(price,
|
|
line.laundry_obj.currency_id,
|
|
line.qty,
|
|
product=line.product_id,
|
|
partner=line.laundry_obj.partner_shipping_id)
|
|
line.update({
|
|
'price_tax': taxes['total_included'] - taxes['total_excluded'],
|
|
})
|
|
|