# -*- coding: utf-8 -*- from openerp import http from openerp.http import request from werkzeug.wrappers import Response from werkzeug.datastructures import Headers from datetime import datetime from StringIO import StringIO from gzip import GzipFile from StringIO import StringIO as IO import simplejson as json import gzip import logging LOGGER = logging.getLogger(__name__) class PaymentsSales(http.Controller): ''' Get server date ''' def get_server_date(self): return datetime.now().strftime('%y-%m-%d') ''' Get partner customer ''' def get_user(self): user = request.env.user return { 'id': user.id, 'name': user.name, 'displayName': user.display_name, 'company': { 'id': user.company_id.id, 'name': user.company_id.name }, 'currency': { 'id': user.company_id.currency_id.id, 'name': user.company_id.currency_id.name, 'displayName': user.company_id.currency_id.display_name, 'symbol': user.company_id.currency_id.symbol, 'rateSilent': user.company_id.currency_id.rate_silent, 'thousandsSeparator': user.company_id.currency_id.thousands_separator, 'decimalSeparator': user.company_id.currency_id.decimal_separator, 'decimalPlaces': user.company_id.currency_id.decimal_places } } ''' Get partner customer ''' def get_customers(self): domain = [('customer', '=', True), ('active', '=', True), ('credit', '>', 0)] partners = [] for customer in request.env['res.partner'].search(domain): invoices = [] partner_invoice = [] for invoice_ids in customer.invoice_ids: if invoice_ids.state == 'open': partner_invoice.append(invoice_ids.id) if customer.is_company == True: for child in customer.child_ids: for invoice_ids in child.invoice_ids: if invoice_ids.state == 'open': partner_invoice.append(invoice_ids.id) # for invoice in request.env['account.invoice'].browse(partner_invoice): for invoice in request.env['account.invoice'].search([('id', 'in', partner_invoice),('state', '=', 'open')]): movelines = [] moves = [] currency_symbol = "" for move in invoice.move_id: for moveline in move.line_id: if moveline.amount_residual > 0 and moveline.state != "draft" and moveline.credit <= 0: movelines.append({ 'id': moveline.id, 'amountResidual': moveline.amount_residual, 'credit': moveline.credit, 'debit': moveline.debit, 'dateMaturity': moveline.date_maturity, 'invoice': invoice.id }) invoices.append({ 'id': invoice.id, 'number': invoice.number, 'dateInvoice': invoice.date_invoice, 'amountTotal': invoice.amount_total, 'residual': invoice.residual, 'moveLines': movelines, 'currency' : { 'id': invoice.currency_id.id, 'name': invoice.currency_id.name, 'displayName': invoice.currency_id.display_name, 'symbol': invoice.currency_id.symbol, 'rateSilent': invoice.currency_id.rate_silent, 'thousandsSeparator': invoice.currency_id.thousands_separator, 'decimalSeparator': invoice.currency_id.decimal_separator, 'decimalPlaces': invoice.currency_id.decimal_places } }) partners.append({ 'id': customer.id, 'name': customer.name, 'displayName': customer.display_name, 'ruc': customer.ruc, 'imageMedium': customer.image_medium, 'phone': customer.phone, 'mobile': customer.mobile, 'email': customer.email, 'credit': customer.credit, 'creditLimit': customer.credit_limit, 'invoices': invoices }) return partners ''' Get Journal ''' def get_journals(self): domain =[('active', '=', True),('type', 'in',['bank', 'cash'])] paymentsJournals = [] for journal in request.env['account.journal'].search(domain, order="id"): if not (journal.store_ids >= request.env.user.store_ids): continue paymentsJournals.append({ 'id': journal.id, 'name': journal.name, 'displayName': journal.display_name, 'code': journal.code, 'cashControl': journal.cash_control, 'type': journal.type, 'currency': { 'id': journal.currency.id, 'name': journal.currency.name, 'displayName': journal.currency.display_name, 'symbol': journal.currency.symbol, 'rateSilent': journal.currency.rate_silent }, 'defaultCreditAccount':{ 'id': journal.default_credit_account_id.id, 'name': journal.default_credit_account_id.name, 'displayName': journal.default_credit_account_id.display_name, 'code': journal.default_credit_account_id.code, 'exchangeRate': journal.default_credit_account_id.exchange_rate, 'foreignBalance': journal.default_credit_account_id.foreign_balance, 'reconcile': journal.default_credit_account_id.reconcile, 'debit': journal.default_credit_account_id.debit, 'credit': journal.default_credit_account_id.credit, 'currencyMode': journal.default_credit_account_id.currency_mode, 'companyCurrency':{ 'id': journal.default_credit_account_id.company_currency_id.id, 'name': journal.default_credit_account_id.company_currency_id.name, 'displayName': journal.default_credit_account_id.company_currency_id.display_name, 'symbol': journal.default_credit_account_id.company_currency_id.symbol, 'rateSilent': journal.default_credit_account_id.company_currency_id.rate_silent }, 'currency':{ 'id': journal.default_credit_account_id.currency_id.id, 'name': journal.default_credit_account_id.currency_id.name, 'displayName': journal.default_credit_account_id.currency_id.display_name, 'symbol': journal.default_credit_account_id.currency_id.symbol, 'rateSilent': journal.default_credit_account_id.currency_id.rate_silent }, } }) return paymentsJournals ''' Get Currency ''' def get_currency(self): return [{ 'id': currency.id, 'name': currency.name, 'displayName': currency.display_name, 'base': currency.base, 'accuracy': currency.accuracy, 'rateSilent': currency.rate_silent, 'rounding': currency.rounding, 'symbol': currency.symbol, 'position': currency.position, 'thousandsSeparator': currency.thousands_separator, 'decimalSeparator': currency.decimal_separator, 'decimalPlaces': currency.decimal_places } for currency in request.env['res.currency'].search([('active', '=', True)])] ''' Make JSON response ''' def make_json_response(self, data=None, status=200): return Response(json.dumps(data), status=status, content_type='application/json') ''' Make GZIP to JSON response ''' def make_gzip_response(self, data=None, status=200): gzip_buffer = IO() with GzipFile(mode='wb', compresslevel=9, fileobj=gzip_buffer) as gzip_file: gzip_file.write(json.dumps(data)) contents = gzip_buffer.getvalue() gzip_buffer.close() headers = Headers() headers.add('Content-Encoding', 'gzip') headers.add('Vary', 'Accept-Encoding') headers.add('Content-Length', len(contents)) return Response(contents, status=status, headers=headers, content_type='application/json') ''' Logger Info ''' def make_info_log(self, log): LOGGER.info(log) ''' New Payments resource router ''' @http.route('/eiru_payments/init', auth='user', methods=['GET'], cors='*') def init_payments(self, **kw): self.make_info_log('Sending JSON response') return self.make_gzip_response({ 'date': self.get_server_date(), 'user': self.get_user(), 'customers': self.get_customers() # 'journals': self.get_journals(), # 'currencies': self.get_currency() })