kalenislims/lims_analytic/stock.py

163 lines
5.6 KiB
Python

# -*- coding: utf-8 -*-
# This file is part of lims_analytic module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from decimal import Decimal
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
class Move(metaclass=PoolMeta):
__name__ = 'stock.move'
def _get_account_stock_move_lines(self, type_):
move_line, = super()._get_account_stock_move_lines(type_)
if not move_line.account.type.expense:
return [move_line]
analytic_account = None
if type_ in ('out_lost_found', 'out_production'):
if self.product.account_stock_used:
if self.product.account_stock_used.type.expense:
return [move_line]
analytic_account = self.from_location.cost_center
elif type_ == 'in_lost_found':
if self.product.account_stock_used:
if self.product.account_stock_used.type.expense:
return [move_line]
analytic_account = self.to_location.cost_center
elif type_ in ('in_supplier', 'out_supplier'):
if self.department:
analytic_account = self.department.default_location.cost_center
if not analytic_account:
return [move_line]
analytic_line = self._get_account_analytic_line(
move_line, analytic_account)
move_line.analytic_lines = [analytic_line]
return [move_line]
def _get_account_stock_move_line(self, amount, type_):
'''
Return counterpart move line value for stock move
'''
pool = Pool()
AccountMoveLine = pool.get('account.move.line')
move_line = AccountMoveLine(
account=self.product.account_stock_used,
)
if not amount:
return
if amount >= Decimal('0.0'):
move_line.debit = Decimal('0.0')
move_line.credit = amount
else:
move_line.debit = - amount
move_line.credit = Decimal('0.0')
if not move_line.account.type.expense:
return move_line
analytic_account = None
if type_ in ('out_lost_found', 'out_production'):
if self.product.account_stock_used:
if self.product.account_stock_used.type.expense:
return move_line
analytic_account = self.from_location.cost_center
elif type_ == 'in_lost_found':
if self.product.account_stock_used:
if self.product.account_stock_used.type.expense:
return move_line
analytic_account = self.to_location.cost_center
elif type_ in ('in_supplier', 'out_supplier'):
if self.department:
analytic_account = self.department.default_location.cost_center
if not analytic_account:
return move_line
analytic_line = self._get_account_analytic_line(
move_line, analytic_account)
move_line.analytic_lines = [analytic_line]
return move_line
def _get_account_analytic_line(self, move_line, analytic_account):
'''
Return analytic line value for account move line
'''
pool = Pool()
Date = pool.get('ir.date')
AnalyticLine = pool.get('analytic_account.line')
date = self.effective_date or Date.today()
with Transaction().set_user(0, set_context=True):
analytic_line = AnalyticLine(
debit=move_line.debit,
credit=move_line.credit,
account=analytic_account.id,
date=date,
)
return analytic_line
def _get_account_stock_move(self):
'''
Return account move for stock move
'''
pool = Pool()
AccountMove = pool.get('account.move')
Date = pool.get('ir.date')
Period = pool.get('account.period')
AccountConfiguration = pool.get('account.configuration')
if self.fraction:
return
if self.product.type != 'goods':
return
date = self.effective_date or Date.today()
period_id = Period.find(self.company.id, date=date)
period = Period(period_id)
if not hasattr(period.fiscalyear, 'account_stock_method'):
return
if not period.fiscalyear.account_stock_method:
return
type_ = self._get_account_stock_move_type()
if not type_:
return
if type_ == 'supplier_customer':
account_move_lines = self._get_account_stock_move_lines(
'in_supplier')
account_move_lines.extend(self._get_account_stock_move_lines(
'out_customer'))
elif type_ == 'customer_supplier':
account_move_lines = self._get_account_stock_move_lines(
'in_customer')
account_move_lines.extend(self._get_account_stock_move_lines(
'out_supplier'))
else:
account_move_lines = self._get_account_stock_move_lines(type_)
amount = Decimal('0.0')
for line in account_move_lines:
amount += line.debit - line.credit
move_line = self._get_account_stock_move_line(amount, type_)
if move_line:
account_move_lines.append(move_line)
account_configuration = AccountConfiguration(1)
return AccountMove(
journal=account_configuration.stock_journal,
period=period_id,
date=date,
origin=self,
lines=account_move_lines,
)