151 lines
4.9 KiB
Python
151 lines
4.9 KiB
Python
# 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
|