# -*- coding: utf-8 -*- # This file is part of the cashbook-module from m-ds for Tryton. # The COPYRIGHT file at the top level of this repository contains the # full copyright notices and license terms. from trytond.model import ModelView, ModelSQL, Workflow, fields, Check from trytond.pool import Pool from trytond.pyson import Eval, If from trytond.report import Report from trytond.i18n import gettext from trytond.transaction import Transaction from .line import sel_linetype, sel_bookingtype, STATES, DEPENDS from .book import sel_state_book class SplitLine(ModelSQL, ModelView): 'Split booking line' __name__ = 'cashbook.split' line = fields.Many2One(string='Line', required=True, select=True, ondelete='CASCADE', model_name='cashbook.line', readonly=True) description = fields.Text(string='Description', states=STATES, depends=DEPENDS) category = fields.Many2One(string='Category', model_name='cashbook.category', ondelete='RESTRICT', states=STATES, depends=DEPENDS+['bookingtype'], required=True, domain=[ If( Eval('bookingtype', '') == 'spin', ('cattype', '=', 'in'), ('cattype', '=', 'out'), )]) category_view = fields.Function(fields.Char(string='Category', readonly=True), 'on_change_with_category_view') amount = fields.Numeric(string='Amount', digits=(16, Eval('currency_digits', 2)), required=True, states=STATES, depends=DEPENDS+['currency_digits']) currency = fields.Function(fields.Many2One(model_name='currency.currency', string="Currency", readonly=True), 'on_change_with_currency') currency_digits = fields.Function(fields.Integer(string='Currency Digits', readonly=True), 'on_change_with_currency_digits') bookingtype = fields.Function(fields.Selection(string='Type', readonly=True, selection=sel_bookingtype), 'on_change_with_bookingtype') state = fields.Function(fields.Selection(string='State', readonly=True, selection=sel_linetype), 'on_change_with_state') state_cashbook = fields.Function(fields.Selection(string='State of Cashbook', readonly=True, states={'invisible': True}, selection=sel_state_book), 'on_change_with_state_cashbook') def get_rec_name(self, name): """ short + name """ return '%(type)s|%(amount)s %(symbol)s|%(desc)s [%(category)s]' % { 'desc': (self.description or '-')[:40], 'amount': Report.format_number(self.amount, None), 'symbol': getattr(self.currency, 'symbol', '-'), 'category': self.category_view, 'type': gettext('cashbook.msg_line_bookingtype_%s' % self.line.bookingtype), } def get_amount_by_second_currency(self, to_currency): """ get amount, calculate credit/debit from currency of current cashbook to 'to_currency' """ Currency = Pool().get('currency.currency') values = { 'amount': self.amount, } if to_currency.id != self.line.cashbook.currency.id: with Transaction().set_context({ 'date': self.line.date, }): values['amount'] = Currency.compute( self.line.cashbook.currency, self.amount, to_currency) return values @fields.depends('category') def on_change_with_category_view(self, name=None): """ show optimizef form of category for list-view """ Configuration = Pool().get('cashbook.configuration') if self.category: cfg1 = Configuration.get_singleton() if getattr(cfg1, 'catnamelong', True) == True: return self.category.rec_name else : return self.category.name @fields.depends('line', '_parent_line.state') def on_change_with_state(self, name=None): """ get state """ if self.line: return self.line.state @fields.depends('line', '_parent_line.cashbook') def on_change_with_state_cashbook(self, name=None): """ get state of cashbook """ if self.line: return self.line.cashbook.state @fields.depends('line', '_parent_line.bookingtype') def on_change_with_bookingtype(self, name=None): """ get type """ if self.line: return self.line.bookingtype @fields.depends('line', '_parent_line.cashbook') def on_change_with_currency(self, name=None): """ currency of cashbook """ if self.line: return self.line.cashbook.currency.id @fields.depends('line', '_parent_line.cashbook') def on_change_with_currency_digits(self, name=None): """ currency-digits of cashbook """ if self.line: return self.line.cashbook.currency.digits else: return 2 @classmethod def create(cls, vlist): """ add debit/credit """ Line2 = Pool().get('cashbook.line') vlist = [x.copy() for x in vlist] records = super(SplitLine, cls).create(vlist) to_update_line = [] for record in records: if not record.line in to_update_line: to_update_line.append(record.line) if len(to_update_line) > 0: Line2.update_amount_by_splitlines(to_update_line) @classmethod def write(cls, *args): """ deny update if cashbook.line!='open', add or update debit/credit """ Line2 = Pool().get('cashbook.line') actions = iter(args) to_update_line = [] for records, values in zip(actions, actions): Line2.check_permission_write([x.line for x in records]) if 'amount' in values.keys(): for record in records: if not record.line in to_update_line: to_update_line.append(record.line) super(SplitLine, cls).write(*args) if len(to_update_line) > 0: Line2.update_amount_by_splitlines(to_update_line) @classmethod def delete(cls, splitlines): """ deny delete if book is not 'open' or wf is not 'edit' """ Line2 = Pool().get('cashbook.line') Line2.check_permission_delete([x.line for x in splitlines]) return super(SplitLine, cls).delete(splitlines) # end SplitLine