# This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. from trytond.model import ModelView, fields from trytond.wizard import Wizard, StateView, Button, StateReport from trytond.transaction import Transaction from trytond.pool import Pool from trytond.report import Report from decimal import Decimal from datetime import date __all__ = ['ReportCloseStatementStart', 'PrintReportCloseStatement', 'CashRegister'] class ReportCloseStatementStart(ModelView): "Vista inicial de reporte de extracto" __name__ = 'sale.print_cash_register.start' date = fields.Date('Date', required=True) shop = fields.Many2One('sale.shop', 'Shop', required=True) @classmethod def default_date(cls): return date.today() @classmethod def default_shop(cls): context = Transaction().context shop = context['shop'] if shop: return shop class PrintReportCloseStatement(Wizard): "Asistente para imprimir extracto" __name__ = 'sale.print_cash_register' start = StateView( 'sale.print_cash_register.start', 'sale_fast_food.print_cash_register_start_view_form', [ Button("Cancel", 'end', 'tryton-cancel'), Button("Print Cash Register", 'print_cash_register', 'tryton-ok', default=True)]) print_cash_register = StateReport('sale.cash_register') def do_print_cash_register(self, action): data = { 'date': self.start.date, 'shop': self.start.shop.id } return action, data def transition_print_cash_register(self): return 'end' class CashRegister(Report): "Extracto" __name__ = 'sale.cash_register' def _get_info_pizzas_sold(lines): pizzas = 0 amount_w_tax = 0 amount_tip = 0 for line in lines: if line.bought_pizza: pizzas += line.quantity amount_w_tax += line.amount_w_tax if line.product and line.product.template.tip: amount_tip += line.amount return { 'amount_tip': amount_tip, 'amount_w_tax': amount_w_tax, 'pizzas': pizzas, } def _get_statements_by_date(date): pool = Pool() User = pool.get('res.user') Statement = pool.get('account.statement') user = Transaction().user user = User(user) device = user.sale_device if not device: return journals = [j.id for j in device.journals] statements = Statement.search([ ('journal', 'in', journals), ('state', 'in', ['validated', 'posted']), ('date', '=', date) ]) return statements @classmethod def get_context(cls, records, header, data): report_context = super( CashRegister, cls).get_context(records, header, data) pool = Pool() Sale = pool.get('sale.sale') today_sales_domain = [('state', 'in', ['processing', 'done']), ('sale_date', '=', data['date']), ('shop', '=', data['shop'])] today_sales = Sale.search(today_sales_domain, order=[('id', 'ASC')]) if not today_sales: return untaxed_amount = 0 tax_amount = 0 total_amount = 0 total_pizzas = 0 amount_w_tax_pizzas = [] amount_tips = [] for sale in today_sales: untaxed_amount += sale.untaxed_amount tax_amount += sale.tax_amount info_pizzas_sold = cls._get_info_pizzas_sold(sale.lines) total_pizzas += info_pizzas_sold['pizzas'] amount_w_tax_pizzas.append(info_pizzas_sold['amount_w_tax']) amount_tips.append(info_pizzas_sold['amount_tip']) total_amount += sale.total_amount statements = cls._get_statements_by_date(data['date']) if statements: report_context['statements'] = [{ 'name': statement.journal.name, 'start_balance': statement.start_balance, 'end_balance': statement.end_balance, 'total_amount': sum( (line.amount for line in statement.lines if line.description), Decimal(0)) } for statement in statements] report_context['total_statements'] = sum( [s['total_amount'] for s in report_context['statements']]) report_context['amount_w_tax_pizzas'] = sum(amount_w_tax_pizzas) report_context['tips'] = sum(amount_tips) report_context['untaxed_amount'] = untaxed_amount report_context['tax_amount'] = tax_amount report_context['total_amount'] = total_amount report_context['number_pizzas_sold'] = total_pizzas return report_context