trytonpsk-hotel/sale.py

222 lines
8.3 KiB
Python

#This file is part of Presik. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from datetime import datetime
from decimal import Decimal
from trytond.pool import Pool
from trytond.wizard import Wizard, StateView, Button, StateReport
from trytond.report import Report
from trytond.model import ModelView, fields
from trytond.transaction import Transaction
_ZERO = Decimal(0)
class InvoiceIncomeDailyStart(ModelView):
'Invoice Income Daily Start'
__name__ = 'hotel.invoice_income_daily.start'
company = fields.Many2One('company.company', 'Company', required=True)
invoice_date = fields.Date('Invoice Date', required=True)
user = fields.Many2One('res.user', 'User', required=True)
shop = fields.Many2One('sale.shop', 'Shop', required=True)
# journal = fields.Many2One('account.statement.journal', 'Journal')
@staticmethod
def default_company():
return Transaction().context.get('company')
@staticmethod
def default_sale_date():
Date = Pool().get('ir.date')
return Date.today()
class InvoiceIncomeDaily(Wizard):
'Invoice Income Daily'
__name__ = 'hotel.invoice_income_daily'
start = StateView('hotel.invoice_income_daily.start',
'hotel.invoice_income_daily_start_view_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Print', 'print_', 'tryton-ok', default=True),
])
print_ = StateReport('hotel.invoice_income_daily_report')
def do_print_(self, action):
report_context = {
'company': self.start.company.id,
'invoice_date': self.start.invoice_date,
'user': self.start.user.id,
'shop': self.start.shop.id,
}
return action, report_context
def transition_print_(self):
return 'end'
class InvoiceIncomeDailyReport(Report):
'Invoice Income Daily Report'
__name__ = 'hotel.invoice_income_daily_report'
@classmethod
def get_context(cls, records, header, data):
report_context = super().get_context(records, header, data)
pool = Pool()
Invoice = pool.get('account.invoice')
Company = pool.get('company.company')
company = Company(data['company'])
Statement = pool.get('account.statement')
Shop = pool.get('sale.shop')
User = pool.get('res.user')
shop = Shop(data['shop'])
statements = Statement.search([
('date', '=', data['invoice_date']),
('create_uid', '=', data['user']),
])
user = User(data['user'])
records = []
advances = []
statements_ = []
total_advances = []
advances_cash = []
advances_electronic = []
total_statements = []
for statement in statements:
st_amount = sum(l.amount for l in statement.lines)
statements_.append({
'id': statement.id,
'sale_device': statement.sale_device.name,
'journal': statement.journal.name,
'turn': statement.turn,
'total_amount': st_amount,
'state': statement.state,
})
total_statements.append(st_amount)
for l in statement.lines:
sale = l.sale
cash = 0
electronic = 0
if sale and not sale.invoice_number:
for pline in sale.payments:
if pline.statement.journal.kind == 'cash':
advances_cash.append(pline.amount)
cash = pline.amount
else:
electronic = pline.amount
advances_electronic.append(pline.amount)
advances.append({
'number': sale.number,
'reference': sale.reference,
'party': sale.party.name,
'total_amount': pline.amount,
'cash': cash,
'electronic': electronic,
})
total_advances.append(pline.amount)
dom_ = [
('company', '=', data['company']),
('invoice_date', '=', data['invoice_date']),
('shop', '=', data['shop']),
('number', '!=', None),
('state', 'in', ['posted', 'paid', 'canceled']),
('create_uid', '=', data['user']),
]
invoices = Invoice.search(dom_, order=[('number', 'ASC')])
invoices_number = []
total_invoices_cash = []
total_invoices_electronic = []
total_invoices_credit = []
total_invoices_paid = []
total_invoices_amount = []
for invoice in invoices:
invoices_number.append(invoice.number)
cash = 0
electronic = 0
credit = 0
total_invoices_amount.append(invoice.total_amount)
sale = invoice.sales[0]
if not sale.payments:
total_invoices_credit.append(invoice.amount_to_pay)
credit = invoice.amount_to_pay
else:
for p in sale.payments:
if p.statement.date == data['invoice_date']:
if p.statement.journal.kind == 'cash':
cash += p.amount
total_invoices_cash.append(p.amount)
else:
electronic += p.amount
total_invoices_electronic.append(p.amount)
total_invoices_paid.append(p.amount)
inv = {
'number': invoice.number,
'reference': invoice.reference,
'party': invoice.party.name,
'total_amount': invoice.total_amount,
'credit': credit,
'cash': cash,
'electronic': electronic,
'paid': cash + electronic,
'state': invoice.state_string,
}
records.append(inv)
report_context['records'] = records
report_context['advances'] = advances
report_context['statements'] = statements_
report_context['date'] = data['invoice_date']
report_context['company'] = company.party.name
report_context['shop'] = shop.name
report_context['user'] = user.name
report_context['print_date'] = datetime.now()
report_context['total_invoices_amount'] = sum(total_invoices_amount)
report_context['total_invoices_cash'] = sum(total_invoices_cash)
report_context['total_invoices_electronic'] = sum(total_invoices_electronic)
report_context['total_invoices_credit'] = sum(total_invoices_credit)
report_context['total_invoices_paid'] = sum(total_invoices_paid)
report_context['total_advances'] = sum(total_advances)
report_context['advances_cash'] = sum(advances_cash)
report_context['advances_electronic'] = sum(advances_electronic)
report_context['total_statements'] = sum(total_statements)
report_context['start_invoice'] = min(invoices_number) if invoices_number else ''
report_context['end_invoice'] = max(invoices_number) if invoices_number else ''
return report_context
class InvoiceSimplifiedReport(Report):
__name__ = 'account.invoice_simplified'
@classmethod
def get_context(cls, records, header, data):
report_context = super().get_context(records, header, data)
Company = Pool().get('company.company')
categories = {}
if records:
record = records[0]
for l in record.lines:
cat = l.product.template.account_category
taxes = ''
for tax in cat.customer_taxes_used:
taxes += tax.name + ' '
if cat.id not in categories.keys():
categories[cat.id] = {
'description': cat.name,
'amount': l.amount,
'taxes': taxes
}
else:
categories[cat.id]['amount'] += l.amount
record._lines = categories.values()
report_context['company'] = Company(Transaction().context['company'])
return report_context