From a2032a2c782a02f0b1e33a78e144f22274deca70 Mon Sep 17 00:00:00 2001 From: Camilo Sarmiento Date: Fri, 23 Oct 2020 18:10:10 -0500 Subject: [PATCH] add filter view for shops of user --- __init__.py | 9 +- account.xml | 36 +++++++ sale.py | 269 +++++++++++++++++++++++++++++++++++++++++----------- sale.xml | 4 +- tryton.cfg | 1 + 5 files changed, 257 insertions(+), 62 deletions(-) diff --git a/__init__.py b/__init__.py index 3b2e5d5..25485cb 100644 --- a/__init__.py +++ b/__init__.py @@ -12,16 +12,21 @@ def register(): company.ConnectionCompanies, sale.Sale, sale.SaleIncomeDailyStart, + sale.SaleMonthByShopStart, + sale.SaleGoalAnnualRankingStart, + sale.SaleDetailedStart, + sale.ShopDailySummaryStart, account.PrintBalanceSheetCOLGAAPStart, account.PrintIncomeStatementCOLGAAPStart, module='syncronize_companies', type_='model') Pool.register( - sale.SaleIncomeDailyReport, + sale.SaleDailyReport, + sale.SaleDetailedReport, + sale.PortfolioDetailedReport, account.BalanceSheetCOLGAAP, account.IncomeStatementCOLGAAP, module='syncronize_companies', type_='report') Pool.register( - sale.SaleIncomeDaily, account.PrintBalanceSheetCOLGAAP, account.PrintIncomeStatementCOLGAAP, module='syncronize_companies', type_='wizard') diff --git a/account.xml b/account.xml index c6d71b7..2aba896 100644 --- a/account.xml +++ b/account.xml @@ -15,6 +15,42 @@ print_income_statement_colgaap_start_form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sale.py b/sale.py index 161dd64..3167082 100644 --- a/sale.py +++ b/sale.py @@ -14,8 +14,9 @@ from trytond.wizard import ( from trytond.report import Report __all__ = [ - 'SaleIncomeDailyStart', 'SaleIncomeDaily', - 'SaleIncomeDailyReport', + 'SaleIncomeDailyStart', 'SaleDailyReport', + 'SaleMonthByShopStart', 'SaleGoalMonthRankingReport', 'SaleDetailedStart', + 'SaleDetailedReport', 'ShopDailySummaryStart', 'PortfolioDetailedReport' ] _ZERO = Decimal('0.00') @@ -24,74 +25,226 @@ _ZERO = Decimal('0.00') class Sale(metaclass=PoolMeta): __name__ = 'sale.sale' - @classmethod - def get_records_income_daily_report(cls, args, ctx): - report_context = {} - pool = Pool() - Report = pool._pool['TODOREPUESTOS']['report']['sale_pos.report_sale_detailed'] - report_context = Report.get_context({}, args['data']) - return report_context - class SaleIncomeDailyStart(metaclass=PoolMeta): __name__ = 'sale_pos.sale_income_daily.start' - sincronize = fields.Boolean('Syncronize') + @classmethod + def __setup__(cls): + super(SaleIncomeDailyStart, cls).__setup__() + cls.shop.domain.append( + ('id', 'in', Eval('context', {}).get('shops', -1)) + ) -class SaleIncomeDaily(metaclass=PoolMeta): - __name__ = 'sale_pos.sale_income_daily' - - def do_print_(self, action): - action, data = super(SaleIncomeDaily, self).do_print_(action) - data['sincronize'] = self.start.sincronize - return action, data - - -class SaleIncomeDailyReport(metaclass=PoolMeta): - __name__ = 'sale_pos.sale_income_daily_report' +class SaleDailyReport(metaclass=PoolMeta): + __name__ = 'sale_goal.sale_daily_report' @classmethod def get_context(cls, records, data): - report_context = super(SaleIncomeDailyReport, cls).get_context(records, data) - Company = Pool().get('company.company') + # 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']) - result = {} - sync = data['sincronize'] - if sync: - date_ = { - '__class__': 'date', - 'year': data['date'].year, - 'month': data['date'].month, - 'day': data['date'].day, + 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, } - data['date'] = date_ - data['sincronize'] = [False] - data['shop'] = None + with Transaction().set_context(ctx): + sales = Sale.search(dom_sales, order=[('number', 'ASC')]) - args = { - 'records': records, - 'data': data, - } - for sync in company.connection_companies: - api_ = 'http://' + sync.api_connection + '/'+ sync.database - route = api_ + '/' + 'report_context' - data_ = json.dumps({ - 'database': sync.database, - 'report_name': 'sale_pos.sale_income_daily_report', - 'args': args, - }) - res = requests.get(route, data=data_) - print(res) - print(res.text) - result = res.json() + untaxed_amount_ = [] + tax_amount_ = [] + total_amount_ = [] + total_amount_ = [] + total_journal_paid_ = [] + sequence = 0 - for k in result.keys(): - if isinstance(result[k], (int, float, Decimal)): - report_context[k] += int(result[k]) - elif isinstance(result[k], list): - report_context[k].extend(result[k]) - if k == 'shop': - report_context[k] += result[k] + ' ' + 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 diff --git a/sale.xml b/sale.xml index c79d464..c1e4718 100644 --- a/sale.xml +++ b/sale.xml @@ -3,11 +3,11 @@ - + diff --git a/tryton.cfg b/tryton.cfg index 34ddf56..ca028b7 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -4,6 +4,7 @@ depends: company sale sale_pos + invoice_report xml: company.xml sale.xml