212 lines
7.2 KiB
Python
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
|