open-synergy/opnsynid-hr

View on GitHub
hr_timesheet_accrue_expense/models/hr_analytic_timesheet.py

Summary

Maintainability
F
3 days
Test Coverage
# -*- coding: utf-8 -*-
# Copyright 2020 OpenSynergy Indonesia
# Copyright 2020 PT. Simetri Sinergi Indonesia
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from openerp import _, api, fields, models
from openerp.exceptions import Warning as UserError


class HrAnalyticTimesheet(models.Model):
    _name = "hr.analytic.timesheet"
    _inherit = "hr.analytic.timesheet"

    accrue_expense_journal_id = fields.Many2one(
        string="Accrue Expense Journal",
        comodel_name="account.journal",
        domain=[
            ("type", "=", "general"),
        ],
    )
    accrue_expense_account_id = fields.Many2one(
        string="Accrue Expense Account",
        comodel_name="account.account",
        domain=[
            ("type", "=", "other"),
        ],
    )
    accrue_expense_ok = fields.Boolean(
        string="Can Create Accrue Expense",
        default=False,
    )
    accrue_expense_move_id = fields.Many2one(
        string="Accrue Expense Move",
        comodel_name="account.move",
        readonly=True,
        ondelete="restrict",
    )

    @api.onchange(
        "user_id",
        "account_id",
    )
    def onchange_accrue_expense_journal_id(self):
        journal = False
        if (
            self.user_id
            and len(self.user_id.employee_ids) > 0
            and self.user_id.employee_ids[0].accrue_expense_journal_id
        ):
            journal = self.user_id.employee_ids[0].accrue_expense_journal_id

        if (
            not journal
            and self.account_id
            and self.account_id.accrue_expense_journal_id
        ):
            journal = self.account_id.accrue_expense_journal_id

        self.accrue_expense_journal_id = journal

    @api.onchange(
        "user_id",
        "account_id",
    )
    def onchange_accrue_expense_account_id(self):
        account = False
        if (
            self.user_id
            and len(self.user_id.employee_ids) > 0
            and self.user_id.employee_ids[0].accrue_expense_account_id
        ):
            account = self.user_id.employee_ids[0].accrue_expense_account_id

        if (
            not account
            and self.account_id
            and self.account_id.accrue_expense_account_id
        ):
            account = self.account_id.accrue_expense_account_id

        self.accrue_expense_account_id = account

    @api.onchange(
        "account_id",
    )
    def onchange_accrue_expense_ok(self):
        result = False

        if self.account_id:
            result = self.account_id.accrue_expense_ok

        self.accrue_expense_ok = result

    @api.multi
    def action_create_accrue_expense_move(self):
        for document in self:
            document._create_accrue_expense_move()

    @api.multi
    def action_unlink_accrue_expense_move(self):
        for document in self:
            document._unlink_accrue_expense_move()

    @api.multi
    def _unlink_accrue_expense_move(self):
        self.ensure_one()
        move = self.accrue_expense_move_id
        self.write(
            {
                "accrue_expense_move_id": False,
            }
        )
        move.unlink()

    @api.multi
    def _create_accrue_expense_move(self):
        self.ensure_one()
        obj_move = self.env["account.move"]
        move = obj_move.create(self._prepare_accrue_expense_move())
        self.write(
            {
                "accrue_expense_move_id": move.id,
            }
        )

    @api.multi
    def _get_accrue_expense_journal(self):
        self.ensure_one()
        if not self.accrue_expense_journal_id:
            err_msg = _("No accrue expense journal defined")
            raise UserError(err_msg)
        return self.accrue_expense_journal_id

    @api.multi
    def _get_accrue_expense_account(self):
        self.ensure_one()
        if not self.accrue_expense_account_id:
            err_msg = _("No accrue expense account defined")
            raise UserError(err_msg)
        return self.accrue_expense_account_id

    @api.multi
    def _get_expense_account(self):
        self.ensure_one()
        return self.general_account_id

    @api.multi
    def _get_accrue_expense_period(self):
        self.ensure_one()
        period = self.env["account.period"].find(self.date)
        return period

    @api.multi
    def _prepare_accrue_expense_move(self):
        self.ensure_one()
        journal = self._get_accrue_expense_journal()
        period = self._get_accrue_expense_period()
        return {
            "journal_id": journal.id,
            "period_id": period.id,
            "date": self.date,
            "line_id": self._prepare_accrue_expense_move_lines(),
        }

    @api.multi
    def _prepare_accrue_expense_move_lines(self):
        self.ensure_one()
        result = []
        result.append(self._prepare_accrue_expense_line())
        result.append(self._prepare_expense_line())
        return result

    @api.multi
    def _get_accrue_expense_partner(self):
        self.ensure_one()
        partner = self.user_id.employee_ids[0].address_home_id
        if not partner:
            err_msg = _("No home address defined")
            raise UserError(err_msg)
        return partner

    @api.multi
    def _prepare_accrue_expense_line(self):
        self.ensure_one()
        return (
            0,
            0,
            {
                "account_id": self._get_accrue_expense_account().id,
                "credit": abs(self.amount),
                "debit": 0.0,
                "analytic_account_id": self.account_id.id,
                "partner_id": self._get_accrue_expense_partner().id,
                "name": self.name,
                "product_id": self.product_id.id,
                "product_uom_id": self.product_uom_id.id,
                "quantity": self.unit_amount,
            },
        )

    @api.multi
    def _prepare_expense_line(self):
        self.ensure_one()
        return (
            0,
            0,
            {
                "account_id": self._get_expense_account().id,
                "analytic_account_id": self.account_id.id,
                "debit": abs(self.amount),
                "credit": 0.0,
                "partner_id": self._get_accrue_expense_partner().id,
                "name": self.name,
                "product_id": self.product_id.id,
                "product_uom_id": self.product_uom_id.id,
                "quantity": self.unit_amount,
            },
        )