trytonpsk-syncronize_companies/sale.py

251 lines
8.1 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.
import time
from decimal import Decimal
import requests
import simplejson as json
from datetime import datetime, date
from trytond.model import ModelView, fields
from trytond.pool import PoolMeta, Pool
from trytond.transaction import Transaction
from trytond.pyson import Bool, Eval, Or, Not
from trytond.wizard import (
Wizard, StateView, StateAction, StateReport, StateTransition, Button)
from trytond.report import Report
__all__ = [
'SaleIncomeDailyStart', 'SaleDailyReport',
'SaleMonthByShopStart', 'SaleGoalMonthRankingReport', 'SaleDetailedStart',
'SaleDetailedReport', 'ShopDailySummaryStart', 'PortfolioDetailedReport'
]
_ZERO = Decimal('0.00')
class Sale(metaclass=PoolMeta):
__name__ = 'sale.sale'
class SaleIncomeDailyStart(metaclass=PoolMeta):
__name__ = 'sale_pos.sale_income_daily.start'
@classmethod
def __setup__(cls):
super(SaleIncomeDailyStart, cls).__setup__()
cls.shop.domain.append(
('id', 'in', Eval('context', {}).get('shops', -1))
)
class SaleDailyReport(metaclass=PoolMeta):
__name__ = 'sale_goal.sale_daily_report'
@classmethod
def get_context(cls, records, data):
# report_context = super(SaleDailyReport, cls).get_context(records, data)
report_context = {}
pool = Pool()
Sale = pool.get('sale.sale')
User = pool.get('res.user')
Company = pool.get('company.company')
company = Company(data['company'])
Journal = pool.get('account.statement.journal')
user_ = User(Transaction().user)
dom_sales = [
('company', '=', data['company']),
('sale_date', '=', data['sale_date']),
('number', '!=', None),
]
states_sale = ['confirmed', 'processing', 'done']
if data['include_canceled']:
states_sale.append('cancel')
dom_sales.append(('state', 'in', states_sale))
journal_name = ''
if data['journal']:
dom_sales.append(('payments.statement.journal', '=', data['journal']))
journal = Journal(data['journal'])
journal_name = journal.name.upper()
ctx = {
'company': user_.company.id,
'user': user_.id,
'shops': [s.id for s in user_.shops],
'shop': user_.shop.id,
}
with Transaction().set_context(ctx):
sales = Sale.search(dom_sales, order=[('number', 'ASC')])
untaxed_amount_ = []
tax_amount_ = []
total_amount_ = []
total_amount_ = []
total_journal_paid_ = []
sequence = 0
for sale in sales:
sequence += 1
setattr(sale, 'sequence', sequence)
journal_paid = _ZERO
if data['journal'] and sale.state != 'cancel':
for p in sale.payments:
if p.statement.journal.id == data['journal']:
journal_paid += p.amount
total_journal_paid_.append(journal_paid)
setattr(sale, 'journal_paid', journal_paid)
if not hasattr(sale, 'sale_device'):
setattr(sale, 'sale_device', None)
if sale.state == 'cancel':
continue
untaxed_amount_.append(sale.untaxed_amount)
tax_amount_.append(sale.tax_amount)
total_amount_.append(sale.total_amount)
report_context['data'] = data
report_context['records'] = sales
report_context['total_amount'] = sum(total_amount_)
report_context['tax_amount'] = sum(tax_amount_)
report_context['untaxed_amount'] = sum(untaxed_amount_)
report_context['date'] = data['sale_date']
report_context['company'] = company.party.name
report_context['journal'] = journal_name
report_context['total_journal_paid'] = sum(total_journal_paid_)
return report_context
class SaleMonthByShopStart(metaclass=PoolMeta):
__name__ = 'sale_goal.sale_month_shop.start'
@classmethod
def __setup__(cls):
super(SaleMonthByShopStart, cls).__setup__()
cls.shop.domain.append(
('id', 'in', Eval('context', {}).get('shops', -1))
)
class SaleGoalAnnualRankingStart(metaclass=PoolMeta):
__name__ = 'sale_goal.annual_ranking.start'
@classmethod
def __setup__(cls):
super(SaleGoalAnnualRankingStart, cls).__setup__()
cls.shop.domain.append(
('id', 'in', Eval('context', {}).get('shops', -1))
)
class SaleDetailedStart(metaclass=PoolMeta):
__name__ = 'sale_pos.sale_detailed.start'
@classmethod
def __setup__(cls):
super(SaleDetailedStart, cls).__setup__()
cls.shop.domain.append(
('id', 'in', Eval('context', {}).get('shops', -1))
)
class SaleDetailedReport(metaclass=PoolMeta):
__name__ = 'sale_pos.report_sale_detailed'
@classmethod
def get_context(cls, records, data):
# report_context = super(SaleDetailedReport, cls).get_context(records, data)
report_context = {}
pool = Pool()
Sale = pool.get('sale.sale')
SaleLine = pool.get('sale.line')
Company = pool.get('company.company')
User = pool.get('res.user')
user_ = User(Transaction().user)
ctx = {
'company': user_.company.id,
'user': user_.id,
'shops': [s.id for s in user_.shops],
'shop': user_.shop.id,
}
sales_line_dom = [
('sale.sale_date', '>=', data['start_date']),
('sale.sale_date', '<=', data['end_date']),
('sale.company', '=', data['company']),
('sale.state', 'in', ['processing', 'done']),
]
if data['salesman']:
sales_line_dom.append(
('sale.salesman', '=', data['salesman'])
)
if data['shop']:
sales_line_dom.append(
('sale.shop', '=', data['shop'])
)
if data['party']:
sales_line_dom.append(
('sale.party', '=', data['party'])
)
if data['product']:
sales_line_dom.append(
('product', '=', data['product'])
)
with Transaction().set_context(ctx):
start_lines = SaleLine.search(sales_line_dom, order=[('sale.sale_date', 'ASC')])
lines = []
amount = []
amount_w_tax = []
for line in start_lines:
if line.type == 'line' and not line.product:
Sale.raise_user_error('sale_not_product', line.sale.number)
is_invoiced = False
if line.sale.invoices:
for inv in line.sale.invoices:
if inv.state not in ['draft', 'cancel']:
is_invoiced = True
if is_invoiced:
lines.append(line)
amount.append(line.amount)
amount_w_tax.append(line.amount_w_tax)
else:
lines.append(line)
amount.append(line.amount)
amount_w_tax.append(line.amount_w_tax)
report_context['data'] = data
report_context['amount'] = sum(amount)
report_context['amount_w_tax'] = sum(amount_w_tax)
report_context['records'] = lines
report_context['company'] = Company(data['company'])
return report_context
class ShopDailySummaryStart(metaclass=PoolMeta):
__name__ = 'sale_pos.shop_daily_summary.start'
@classmethod
def __setup__(cls):
super(ShopDailySummaryStart, cls).__setup__()
cls.shop.domain.append(
('id', 'in', Eval('context', {}).get('shops', -1))
)
class PortfolioDetailedReport(Report):
__name__ = 'party.portfolio_detailed.report'
@classmethod
def get_domain_invoice(cls, domain, data):
User = Pool().get('res.user')
user = User(Transaction().user)
shops = [s.id for s in user.shops]
dom = [('shop', 'in', shops)]
domain.extend(dom)
return domain