# 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 trytond.exceptions import UserError 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' company = fields.Many2One( 'company.company', "Company", readonly=True, required=True) currency = fields.Many2One('currency.currency', 'Currency', required=True) date = fields.Date('Date', required=True) shop = fields.Many2One('sale.shop', 'Shop', required=True) @staticmethod def default_company(): return Transaction().context.get('company') @staticmethod def default_currency(): Company = Pool().get('company.company') if Transaction().context.get('company'): company = Company(Transaction().context['company']) return company.currency.id @classmethod def default_date(cls): return date.today() @classmethod def default_shop(cls): context = Transaction().context if context: shop = context['shop'] if shop: return shop return 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 = { 'lang': self.start.company.party.lang, 'date': self.start.date, 'shop': self.start.shop.id, 'currency': self.start.currency.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 def _get_invoices_by_subtype(date, shop): pool = Pool() Invoice = pool.get('account.invoice') Shop = pool.get('sale.shop') fe_pos_subtype = Shop(shop).fe_pos_subtype.id pos_subtype = Shop(shop).pos_subtype.id ranges = {} invoices_fe = Invoice.search([('invoice_date', '=', date), ('subtype', '=', fe_pos_subtype)]) if invoices_fe: ranges['range_fe'] = \ [invoices_fe[0].number, invoices_fe[-1].number] invoices_pos = Invoice.search([('invoice_date', '=', date), ('subtype', '=', pos_subtype)]) if invoices_pos: ranges['range_pos'] = \ [invoices_pos[0].number, invoices_pos[-1].number] return ranges @classmethod def get_context(cls, records, header, data): report_context = super( CashRegister, cls).get_context(records, header, data) pool = Pool() Shop = pool.get('sale.shop') Sale = pool.get('sale.sale') Currency = pool.get('currency.currency') currency = Currency(data['currency']) date = data['date'] shop = data['shop'] today_sales_domain = [('state', 'in', ['processing', 'done']), ('sale_date', '=', date), ('shop', '=', shop)] today_sales = Sale.search(today_sales_domain, order=[('id', 'ASC')]) if not today_sales: raise UserError(str("No se han encontrado ventas para este día.")) 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 untaxed_amount_for_tax = round((tax_amount * 100) / Decimal('8.0'), 2) 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']]) ranges = cls._get_invoices_by_subtype(date, shop) ranges_keys = ranges.keys() if 'range_fe' in ranges_keys: report_context['range_fe'] = ranges['range_fe'] else: report_context['range_fe'] = [] if 'range_pos' in ranges: report_context['range_pos'] = ranges['range_pos'] else: report_context['range_pos'] = [] report_context['shop'] = Shop(shop).name report_context['date'] = date report_context['currency'] = currency 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['untaxed_amount_for_tax'] = untaxed_amount_for_tax report_context['tax_amount'] = tax_amount report_context['total_amount'] = total_amount report_context['number_pizzas_sold'] = total_pizzas return report_context