trytondo-sale_fast_food/report_close_statement.py

212 lines
7.2 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 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
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 = {
'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
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['tax_amount'] = tax_amount
report_context['total_amount'] = total_amount
report_context['number_pizzas_sold'] = total_pizzas
return report_context