~openerp-chinese-team/openerp-china/openerp-china

« back to all changes in this revision

Viewing changes to oecn_account_print/report/oecn_account_print_report.py

  • Committer: JoshuaJan
  • Date: 2012-02-21 03:21:40 UTC
  • Revision ID: joshua@openerp.cn-20120221032140-4wwk95ftpf9x24ec
change the shipped date for report MM

Show diffs side-by-side

added added

removed removed

Lines of Context:
125
125
                    " date_start>='%s' and date_stop<='%s' "\
126
126
                    " order by date_start")% (self.all_date['period_start_date_start'], self.all_date['period_end_date_stop']))
127
127
        periods = self.cr.dictfetchall()
128
 
        print 'peirod:',periods
 
128
        print 'peirod---->:',periods
129
129
        return periods
130
130
 
131
131
    def _beginning_balance_accounts(self, account):
259
259
        return result
260
260
 
261
261
report_sxw.report_sxw('report.account.general_ledger', 'account.account', 'addons/oecn_account_print/report/general_ledger.rml', parser=general_ledger_parser, header=False)
 
262
 
 
263
 
 
264
class detail_ledger_parser(rml_parse.rml_parse):
 
265
    """
 
266
    通用帐簿解析器基类(即报表后台)
 
267
    """
 
268
    def __init__(self, cr, uid, name, context):
 
269
        super(detail_ledger_parser, self).__init__(cr, uid, name, context)
 
270
        # self.date_borne = {}
 
271
        self.query = ""
 
272
        self.child_ids = ""
 
273
        self.sql_condition = " "
 
274
        self.tot_currency = 0.0
 
275
        self.period_sql = ""
 
276
        self.sold_accounts = {}
 
277
        self.localcontext.update( { # 注册报表模板里可以访问的函数
 
278
            'time': time,
 
279
            'lines': self._get_lines,
 
280
            'type':self._check_type,
 
281
            'period_date':self.get_dete,
 
282
            'contrepartie':self._calc_contrepartie,
 
283
            # 'sum_debit_account': self._sum_debit_account,
 
284
            # 'sum_credit_account': self._sum_credit_account,
 
285
            # 'sum_solde_account': self._sum_solde_account,
 
286
            'sum_debit': self._sum_debit,
 
287
            'sum_credit': self._sum_credit,
 
288
            'sum_solde': self._sum_solde,
 
289
            'get_children_accounts': self.get_children_accounts,
 
290
            # 'sum_currency_amount_account': self._sum_currency_amount_account,
 
291
            'get_direction':self._get_direction,
 
292
            # 'sum_quantity_account':self._sum_quantity_account,
 
293
            'account_name' :self._get_account_name,
 
294
            'get_periods':self._get_periods,
 
295
            'sum_begin_solde':self._sum_begin_solde,
 
296
            'sum_year_amount_solde':self._sum_year_amount_solde,
 
297
            'sum_year_amount_currency':self._sum_year_amount_currency,
 
298
            'sum_amount_currency':self._sum_amount_currency,
 
299
            'sum_amount_quantity':self._sum_amount_quantity,
 
300
            'sum_year_quantity':self._sum_year_quantity,
 
301
            'sum_begin_balance_amount_currency':self._sum_begin_balance_amount_currency,
 
302
            'sum_year_balance_amount_currency':self._sum_year_balance_amount_currency,
 
303
            'sum_begin_balance_quantity':self._sum_begin_balance_quantity,
 
304
            'sum_year_balance_quantity':self._sum_year_balance_quantity,
 
305
        })
 
306
        self.context = context
 
307
 
 
308
    def set_context(self, objects, data, ids, report_type = None):
 
309
        """
 
310
        设置 OE context
 
311
        """
 
312
        # self.borne_date = self.get_date(data['form'])
 
313
        print 'data-->',data
 
314
        self.all_dete = self.get_dete(data)
 
315
        self.sql_condition = self.get_threecolumns_ledger_type(data)
 
316
        print 'ids:',ids
 
317
        #new_ids = []
 
318
        #if (data.get('model', False) == 'account.account'):
 
319
        #    new_ids = ids
 
320
        #else:
 
321
        #   new_ids.append(data['Account_list'])
 
322
        #    objects = self.pool.get('account.account').browse(self.cr, self.uid, new_ids)
 
323
 
 
324
        super(detail_ledger_parser, self).set_context(objects, data, ids, report_type)
 
325
 
 
326
    def get_dete(self, data):
 
327
        """
 
328
        分析日期
 
329
        """
 
330
        print 'date:-->',data
 
331
        period_obj = self.pool.get('account.period')
 
332
        period_start_obj = period_obj.browse(self.cr, self.uid, data['period_from'][0])
 
333
        print 'period_start_obj:',period_start_obj
 
334
        period_end_obj = period_obj.browse(self.cr, self.uid, data['period_to'][0])
 
335
        fiscalyear_obj = self.pool.get('account.fiscalyear').browse(self.cr, self.uid, period_start_obj.fiscalyear_id.id)
 
336
        self.all_dete = {
 
337
            'period_start_date_start':period_start_obj.date_start,
 
338
            'period_end_date_stop':period_end_obj.date_stop,
 
339
            'fiscalyear_obj_date_start':fiscalyear_obj.date_start,
 
340
        }
 
341
 
 
342
        return self.all_dete
 
343
 
 
344
    def _get_periods(self):
 
345
        """
 
346
        获取期间
 
347
        """
 
348
        period_obj = self.pool.get('account.period')
 
349
        period_ids = period_obj.search(self.cr, self.uid, [('date_start','>=',self.all_dete['period_start_date_start']),('date_stop','<=',self.all_dete['period_end_date_stop'])], order='date_start')
 
350
        periods = period_obj.browse(self.cr, self.uid, period_ids)
 
351
        return periods
 
352
 
 
353
    def _check_type(self, data):
 
354
        """
 
355
        检测报表类型
 
356
        """
 
357
        print 'data:',data
 
358
        res = {}
 
359
        res['product'] = ""
 
360
        res['partner'] = ""
 
361
        res['report_name'] = u'三栏式'
 
362
        if data.get('product', False):
 
363
            res['report_name'] = u'产品'
 
364
            product = self.pool.get('product.product').browse(self.cr, self.uid ,data['product'][0])
 
365
            res['product'] = product.name or ''
 
366
        if data.get('partner', False):
 
367
            res['report_name'] = u'业务伙伴'
 
368
            partner = self.pool.get('res.partner').browse(self.cr, self.uid, data['partner'][0])
 
369
            res['partner'] = partner.name or ''
 
370
        return res
 
371
 
 
372
    def _calc_contrepartie(self, ids, context=None):
 
373
        """
 
374
        计算"对方科目",下边这是法语吧
 
375
        """
 
376
        result = {}
 
377
        #for id in ids:
 
378
        #    result.setdefault(id, False)
 
379
      
 
380
        for account_line in self.pool.get('account.move.line').browse(self.cr, self.uid, ids, context):
 
381
            # For avoid long text in the field we will limit it to 5 lines
 
382
            print 'account_line------>',account_line
 
383
            result[account_line.id] = ' '
 
384
            num_id_move = str(account_line.move_id.id)
 
385
            num_id_line = str(account_line.id)
 
386
            account_id = str(account_line.account_id.id)
 
387
            # search the basic account
 
388
            # We have the account ID we will search all account move line from now until this time
 
389
            # We are in the case of we are on the top of the account move Line
 
390
            self.cr.execute('SELECT distinct(ac.code) as code_rest,ac.name as name_rest from account_account AS ac, account_move_line mv\
 
391
                    where ac.id = mv.account_id and mv.move_id = ' + num_id_move +' and mv.account_id <> ' + account_id )
 
392
            res_mv = self.cr.dictfetchall()
 
393
            print 'res_mv',res_mv
 
394
            # we need a result more than 2 line to make the test so we will made the the on 1 because we have exclude the current line
 
395
            if (len(res_mv) >=1):
 
396
                concat = ''
 
397
                rup_id = 0
 
398
                for move_rest in res_mv:
 
399
                    concat = concat + move_rest['code_rest'] + u' ' + move_rest['name_rest'] + u';'
 
400
                    result[account_line.id] = concat
 
401
                    if rup_id >5:
 
402
                        # we need to stop the computing and to escape but before we will add "..."
 
403
                        result[account_line.id] = concat + '...'
 
404
                        break
 
405
                    rup_id+=1
 
406
        print 'result-->',result
 
407
        return result
 
408
 
 
409
    def get_date(self, form):
 
410
        """
 
411
        获取 move.lines 的日期区间
 
412
        """
 
413
        period_from_id = form['period_from']
 
414
        period_to_id = form['period_to']
 
415
        period_obj = self.pool.get('account.period')
 
416
        period_start_obj = period_obj.read(self.cr, self.uid, period_from_id, ['date_start'])
 
417
        period_end_obj = period_obj.read(self.cr, self.uid, period_to_id, ['date_stop'])
 
418
        borne_min = period_start_obj['date_start']
 
419
        borne_max = period_end_obj['date_stop']
 
420
 
 
421
        self.date_borne = {
 
422
            'min_date': borne_min,
 
423
            'max_date': borne_max,
 
424
            }
 
425
        return self.date_borne
 
426
 
 
427
    def get_threecolumns_ledger_type(self, form):
 
428
        if form.get('product',''):
 
429
            self.sql_condition = " AND l.product_id ='"+str(form['product'])+"'"
 
430
        if form.get('partner',''):
 
431
            self.sql_condition = " AND l.partner_id ='"+str(form['partner'])+"'"
 
432
        return self.sql_condition
 
433
 
 
434
 
 
435
    def get_children_accounts(self, account, form, period, recursion=True):
 
436
        """
 
437
        遍历指定科目下的所有子科目
 
438
        """
 
439
        self.child_ids = self.pool.get('account.account').search(self.cr, self.uid,[('parent_id', 'child_of', self.ids)])
 
440
 
 
441
        res = []
 
442
        ctx = self.context.copy()
 
443
        ## We will make the test for period or date
 
444
        ## We will now make the test
 
445
        #
 
446
        #ctx['state'] = form['context'].get('state','all')
 
447
        #if form.has_key('fiscalyear'):
 
448
        #    ctx['fiscalyear'] = form['fiscalyear']
 
449
        #    ctx['periods'] = form['periods'][0][2]
 
450
        #else:
 
451
        #    ctx['date_from'] = form['date_from']
 
452
        #    ctx['date_to'] = form['date_to']
 
453
 
 
454
        self.query = self.pool.get('account.move.line')._query_get(self.cr, self.uid, context=ctx)
 
455
        if account and account.child_consol_ids: # add ids of consolidated childs also of selected account
 
456
            ctx['consolidate_childs'] = True
 
457
            ctx['account_id'] = account.id                    
 
458
 
 
459
        ids_acc = self.pool.get('account.account').search(
 
460
            self.cr, self.uid,[('parent_id', 'child_of', [account.id])], context=ctx)
 
461
 
 
462
        for child_id in ids_acc:
 
463
            child_account = self.pool.get('account.account').browse(self.cr, self.uid, child_id)
 
464
            sold_account = self._sum_solde_account(child_account,form, period)
 
465
            self.sold_accounts[child_account.id] = sold_account
 
466
            
 
467
            if child_account.type != 'view' \
 
468
            and len(self.pool.get('account.move.line').search(self.cr, self.uid,
 
469
                [('account_id','>=',child_account.id)],
 
470
                context=ctx)) <> 0 :
 
471
                res.append(child_account)
 
472
 
 
473
        if not len(res):
 
474
            return [account]
 
475
        for move in res:
 
476
            SOLDEINIT = "SELECT sum(l.debit) AS sum_debit, sum(l.credit) AS sum_credit, sum(l.quantity) AS sum_quantity, sum(l.amount_currency) AS sum_amount_currency FROM account_move_line l WHERE l.account_id = " + str(move.id) +  " AND l.date < '" + period['date_stop'] + "'" +  " AND l.date > '" + period['date_start'] +"'"+ self.sql_condition
 
477
            self.cr.execute(SOLDEINIT)
 
478
            resultat = self.cr.dictfetchall()
 
479
            if resultat[0] :
 
480
                if resultat[0]['sum_debit'] == None:
 
481
                    sum_debit = 0
 
482
                else:
 
483
                    sum_debit = resultat[0]['sum_debit']
 
484
                if resultat[0]['sum_credit'] == None:
 
485
                    sum_credit = 0
 
486
                else:
 
487
                    sum_credit = resultat[0]['sum_credit']
 
488
                if resultat[0]['sum_amount_currency'] == None:
 
489
                    sum_amount_currency =0
 
490
                else:
 
491
                    sum_amount_currency = resultat[0]['sum_amount_currency']
 
492
                if resultat[0]['sum_quantity'] == None:
 
493
                    sum_quantity = 0
 
494
                else:
 
495
                    sum_quantity = resultat[0]['sum_quantity']
 
496
 
 
497
                move.init_credit = sum_credit
 
498
                move.init_debit = sum_debit
 
499
                move.init_amount_currency = sum_amount_currency
 
500
                move.init_quantity = sum_quantity
 
501
 
 
502
            else:
 
503
                move.init_credit = 0
 
504
                move.init_debit = 0
 
505
                move.init_currency = 0
 
506
                move.init_quantity = 0
 
507
 
 
508
        return res
 
509
 
 
510
    def _get_lines(self, context=None):
 
511
        '''
 
512
        Get lines for threecolumns ledger
 
513
        '''
 
514
        result = []
 
515
        account_obj = self.pool.get('account.account')
 
516
        account_move_line_obj = self.pool.get('account.move.line')
 
517
        account_child_ids = account_obj.search(self.cr, self.uid, [('parent_id', 'child_of', self.ids)])
 
518
        print 'child_ids:',account_child_ids
 
519
        periods = self._get_periods()
 
520
        for period in periods:
 
521
            lines = []
 
522
            period_balance = 0
 
523
            print '%s - %s'%(period.date_start,period.date_stop)
 
524
            account_move_line_ids = account_move_line_obj.search(self.cr, self.uid, [('account_id','in',account_child_ids),('date','<=',period.date_stop),('date','>=',period.date_start),('state','=','valid')],order='date')
 
525
            for line in account_move_line_obj.browse(self.cr, self.uid, account_move_line_ids):
 
526
                lines.append(line)
 
527
                period_balance += line.debit - line.credit
 
528
            if lines:
 
529
                result.append({
 
530
                    'period':period,
 
531
                    'lines':lines,
 
532
                    'period_balance':period_balance,
 
533
                })
 
534
            
 
535
        print 'result:',result        
 
536
        return result
 
537
 
 
538
    def lines(self, account, form, period, day=False):
 
539
        """
 
540
        按向导指定的参数获取所有的 account.move.line
 
541
        """
 
542
        self.tot_currency = 0.0
 
543
 
 
544
        inv_types = {
 
545
                'out_invoice': 'CI: ',
 
546
                'in_invoice': 'SI: ',
 
547
                'out_refund': 'OR: ',
 
548
                'in_refund': 'SR: ',
 
549
                }
 
550
        sql = """
 
551
            SELECT l.id, l.date, j.code,c.name AS currency_code,l.amount_currency ,l.ref, l.name , l.debit, l.credit, l.period_id, l.quantity
 
552
                    FROM account_move_line as l
 
553
                       LEFT JOIN res_currency c on (l.currency_id=c.id)
 
554
                                JOIN account_journal j on (l.journal_id=j.id)
 
555
                                AND account_id = %%s
 
556
                                AND %s
 
557
                                    %s
 
558
                                WHERE l.date<=%%s
 
559
                                AND l.date>=%%s
 
560
                                ORDER BY l.date, l.id""" % (self.query, self.sql_condition)
 
561
        if day:
 
562
            self.cr.execute(sql, (account.id, day, day,))
 
563
            res = self.cr.dictfetchall()
 
564
        else:
 
565
            self.cr.execute(sql, (account.id, period['date_stop'], period['date_start'],))
 
566
            res = self.cr.dictfetchall()
 
567
        sum = 0.0
 
568
        print 'res-->',res
 
569
        account_move_line_obj = self.pool.get('account.move.line')
 
570
        for l in res:
 
571
            line = self.pool.get('account.move.line').browse(self.cr, self.uid, l['id'])
 
572
            l['move'] = line.move_id.name
 
573
            self.cr.execute('Select id from account_invoice where move_id =%s'%(line.move_id.id))
 
574
            tmpres = self.cr.dictfetchall()
 
575
            if len(tmpres) > 0 :
 
576
                inv = self.pool.get('account.invoice').browse(self.cr, self.uid, tmpres[0]['id'])
 
577
                l['ref'] = inv_types[inv.type] + ': '+str(inv.number)
 
578
            if line.partner_id :
 
579
                l['partner'] = line.partner_id.name
 
580
            else :
 
581
                l['partner'] = ''
 
582
 
 
583
            # 需要修正的地方请加上 FIXME 标记,需要尚未实现完全的地方请加上 TODO
 
584
            # by mrshelly 为啥要初始化, 这里也需要处理
 
585
            if type(l['debit'])  == type(None):
 
586
                l['debit'] = 0.0
 
587
            if type(l['credit'])  == type(None):
 
588
                l['credit'] = 0.0
 
589
            # by mrshelly 为啥要初始化, 这里也需要处理
 
590
 
 
591
            sum = l['debit'] - l ['credit']
 
592
            l['progress'] = sum
 
593
            balance = line.balance
 
594
        
 
595
            l['balance'] = abs(balance)
 
596
            #if balance == 0:
 
597
            #    str = u'平'
 
598
            #elif balance > 0:
 
599
            #    str = u'借'
 
600
            #else:
 
601
            #    str = u'贷'
 
602
            l['direction'] = self._get_direction(l['debit'] - l ['credit'])
 
603
            l['line_corresp'] = self._calc_contrepartie(self.cr,self.uid,[l['id']])[l['id']]
 
604
            # Modification du amount Currency
 
605
            #if (l['credit'] > 0):
 
606
            #    if l['amount_currency'] != None:
 
607
            #        l['amount_currency'] = abs(l['amount_currency']) * -1
 
608
 
 
609
            #if l['amount_currency'] != None:
 
610
            #    l['amount_currency_balance'] = self.tot_currency + l['amount_currency']
 
611
 
 
612
            #单价
 
613
            if (l['quantity'] != None and l['quantity'] !=0):
 
614
                if  l['debit'] != 0.0:
 
615
                    l['price'] = l['debit']/l['quantity']
 
616
                elif  l['credit'] != 0.0:
 
617
                    l['price'] = l['credit']/l['quantity']
 
618
            #汇率
 
619
            if (l['amount_currency'] != None and l['amount_currency'] !=0):
 
620
                if  l['debit'] != 0.0:
 
621
                    l['rate'] = l['debit']/l['amount_currency']
 
622
                elif  l['credit'] != 0.0:
 
623
                    l['rate'] = l['credit']/l['amount_currency']
 
624
            l['sum_balance_amount_currency'] = (self._sum_balance_currency_quantiry(l['date'],l['id']))['sum_balance_amount_currency']
 
625
            l['sum_balance_quantity'] = (self._sum_balance_currency_quantiry(l['date'],l['id']))['sum_balance_quantity']
 
626
        print 'res:',res
 
627
        return ['a','b'] 
 
628
 
 
629
    def _sum_solde_account(self, account, form, period=False):
 
630
        """
 
631
        科目余额合计
 
632
        """
 
633
        if period==False:
 
634
            self.cr.execute("SELECT (sum(debit) - sum(credit)) as tot_solde "\
 
635
                "FROM account_move_line l "\
 
636
                "WHERE l.account_id = "+str(account.id)+" AND l.date<='"+self.all_dete['period_end_date_stop']+"' AND l.date>='"+self.all_dete['period_start_date_start']+"' AND "+self.query+ " "+self.sql_condition)
 
637
        else:
 
638
            self.cr.execute("SELECT (sum(debit) - sum(credit)) as tot_solde "\
 
639
                "FROM account_move_line l "\
 
640
                "WHERE l.account_id = "+str(account.id)+" AND l.date<='"+period['date_stop']+"' AND l.date>='"+period['date_start']+"' AND "+self.query+ " "+self.sql_condition)
 
641
        sum_solde = self.cr.fetchone()[0] or 0.0
 
642
        if form.get('soldeinit', False):
 
643
            sum_solde += account.init_debit - account.init_credit
 
644
 
 
645
        return sum_solde
 
646
 
 
647
    def _sum_begin_solde(self):
 
648
        """
 
649
        期初余额
 
650
        """
 
651
        result = {
 
652
            'begin_date':'',
 
653
            'direction':'',
 
654
            'debit':0,
 
655
            'credit':0,
 
656
            'sum_begin_solde':0,
 
657
        }
 
658
        if not self.ids:
 
659
            return 0.0
 
660
        self.cr.execute("SELECT sum(debit) as debit , sum(credit) as credit \
 
661
                 FROM account_move_line l \
 
662
                 WHERE l.state = 'valid' \
 
663
                 AND l.account_id in ("+','.join(map(str, self.pool.get('account.account').search(self.cr, self.uid,
 
664
            [('parent_id', 'child_of', self.ids)])))+") "+ " AND l.date < '" + self.all_dete['period_start_date_start'] +"'"+self.sql_condition)
 
665
        res = self.cr.dictfetchall()
 
666
        sum_begin_solde = (res[0]['debit'] or 0.0) - (res[0]['credit'] or 0.0)
 
667
        if sum_begin_solde == 0:
 
668
            result['direction'] = u'平'
 
669
        elif sum_begin_solde > 0:
 
670
            result['direction'] = u'借'
 
671
        else:
 
672
            result['direction'] = u'贷'
 
673
        result['sum_begin_solde'] = abs(sum_begin_solde or 0.0)
 
674
        result['begin_date'] = self.all_dete['period_start_date_start']
 
675
        print 'sum---->',result
 
676
        return result
 
677
 
 
678
    def _sum_year_amount_solde(self, date):
 
679
        """
 
680
        本年累计
 
681
        """
 
682
        result = {
 
683
            'end_date':'',
 
684
            'direction':'',
 
685
            'debit':'',
 
686
            'credit':'',
 
687
            'balance':0,
 
688
        }
 
689
        self.cr.execute("SELECT sum(debit) as debit , sum(credit) as credit  "\
 
690
                "FROM account_move_line l "\
 
691
                "WHERE l.account_id in ("+','.join(map(str, self.pool.get('account.account').search(self.cr, self.uid,
 
692
            [('parent_id', 'child_of', self.ids)])))+") "+ " AND l.state='valid' AND l.date <= '" + date +"'"+ " AND l.date >= '" + self.all_dete['fiscalyear_obj_date_start']  + "'"+self.sql_condition)
 
693
        res = self.cr.dictfetchall()
 
694
        sum_year_amount_solde = (res[0]['debit'] or 0.0) - (res[0]['credit'] or 0.0)
 
695
        if sum_year_amount_solde == 0:
 
696
            result['direction'] = u'平'
 
697
        elif sum_year_amount_solde > 0:
 
698
            result['direction'] = u'借'
 
699
        else:
 
700
            result['direction'] = u'贷'
 
701
        result['balance'] = abs(sum_year_amount_solde or 0.0)
 
702
        result['end_date'] = self.all_dete['fiscalyear_obj_date_start']
 
703
        result['debit'] = res[0]['debit']
 
704
        result['credit'] = res[0]['credit']
 
705
        return result
 
706
 
 
707
    def _sum_amount_currency_quantiry(self, start_date = False, end_date = False):
 
708
        """
 
709
        获取外币、数量合计值
 
710
        """
 
711
        result = {
 
712
            'sum_debit_amount_currency':0.00,
 
713
            'sum_credit_amount_currency':0.00,
 
714
            'sum_debit_quantity':0.00,
 
715
            'sum_credit_quantity':0.00,
 
716
        }
 
717
        if end_date:
 
718
            end_date_sql = " AND l.date <= '" + end_date +"'"
 
719
        else:
 
720
            end_date_sql = ' '
 
721
        if start_date:
 
722
            start_date_sql = " AND l.date >= '" + start_date  + "'"
 
723
        else:
 
724
            start_date_sql = ' '
 
725
 
 
726
        #方向是借
 
727
        self.cr.execute("SELECT  sum(amount_currency) AS amount_currency, sum(quantity) AS quantity "\
 
728
                " FROM account_move_line l "\
 
729
                " WHERE l.account_id in ("+','.join(map(str, self.pool.get('account.account').search(self.cr, self.uid,
 
730
            [('parent_id', 'child_of', self.ids)])))+") "+ 
 
731
            " AND l.state<>'draft' AND l.debit-l.credit>0 " + end_date_sql + start_date_sql + self.sql_condition)
 
732
        debit_res = self.cr.dictfetchall()
 
733
 
 
734
        #方向是贷
 
735
        self.cr.execute("SELECT  sum(amount_currency) AS amount_currency, sum(quantity) AS quantity "\
 
736
                " FROM account_move_line l "\
 
737
                " WHERE l.account_id in ("+','.join(map(str, self.pool.get('account.account').search(self.cr, self.uid,
 
738
            [('parent_id', 'child_of', self.ids)])))+") "+ 
 
739
            " AND l.state<>'draft' AND l.debit-l.credit<0 " + end_date_sql + start_date_sql + self.sql_condition)
 
740
        cedit_res = self.cr.dictfetchall()
 
741
        if debit_res[0].get('amount_currency',0.00)!= None:
 
742
            result['sum_debit_amount_currency'] = debit_res[0].get('amount_currency',0.00)
 
743
        if debit_res[0].get('quantity',0.00)!=None:
 
744
            result['sum_debit_quantity'] = debit_res[0].get('quantity',0.00)
 
745
        if cedit_res[0].get('amount_currency',0.00)!=None:
 
746
            result['sum_credit_amount_currency'] = cedit_res[0].get('amount_currency',0.00)
 
747
        if cedit_res[0].get('quantity',0.00)!=None:
 
748
            result['sum_credit_quantity'] = cedit_res[0].get('quantity',0.00)
 
749
        return result
 
750
 
 
751
    def _sum_balance_currency_quantiry(self,date = False, id = False,):
 
752
        """
 
753
        获取外币、数量的余额
 
754
        """
 
755
        result = {
 
756
            'sum_balance_amount_currency':0.00,
 
757
            'sum_balance_quantity':0.00,
 
758
        }
 
759
        sum_debit_amount_currency = 0.00
 
760
        sum_credit_amount_currency = 0.00
 
761
        sum_debit_quantity = 0.00
 
762
        sum_credit_quantity = 0.00
 
763
        balance_condition = ' '
 
764
        if date:
 
765
            balance_condition = " AND l.date <= '" + date +"'"
 
766
        if id and date:
 
767
            balance_condition = " AND (date<'"+str(date)+"' OR (date='"+str(date)+"' AND id<='"+str(id)+"')) "
 
768
 
 
769
        #方向是借
 
770
        self.cr.execute("SELECT sum(amount_currency) AS amount_currency, sum(quantity) AS quantity"\
 
771
                " FROM account_move_line l "\
 
772
                " WHERE l.account_id in ("+','.join(map(str, self.pool.get('account.account').search(self.cr, self.uid,
 
773
            [('parent_id', 'child_of', self.ids)])))+") "+ 
 
774
            " AND l.state<>'draft' AND l.debit-l.credit>0 " + balance_condition + self.sql_condition)
 
775
        debit_res = self.cr.dictfetchall()
 
776
 
 
777
        #方向是贷
 
778
        self.cr.execute("SELECT sum(amount_currency) AS amount_currency, sum(quantity) AS quantity"\
 
779
                " FROM account_move_line l "\
 
780
                " WHERE l.account_id in ("+','.join(map(str, self.pool.get('account.account').search(self.cr, self.uid,
 
781
            [('parent_id', 'child_of', self.ids)])))+") "+ 
 
782
            " AND l.state<>'draft' AND l.debit-l.credit<0 " + balance_condition  + self.sql_condition)
 
783
        cedit_res = self.cr.dictfetchall()
 
784
 
 
785
        if debit_res[0].get('amount_currency',0.0)!=None:
 
786
            sum_debit_amount_currency = debit_res[0].get('amount_currency',0.0)
 
787
            
 
788
        if debit_res[0].get('quantity',0.0)!=None:
 
789
            sum_debit_quantity = debit_res[0].get('quantity',0.0)
 
790
        
 
791
        if cedit_res[0].get('amount_currency',0.0)!=None:
 
792
            sum_credit_amount_currency = cedit_res[0].get('amount_currency',0.0)
 
793
            
 
794
        if cedit_res[0].get('quantity',0.0)!=None:
 
795
            sum_credit_quantity = cedit_res[0].get('quantity',0.0)
 
796
 
 
797
        result['sum_balance_amount_currency'] = abs(sum_debit_amount_currency - sum_credit_amount_currency ) 
 
798
        result['sum_balance_quantity'] = abs(sum_debit_quantity - sum_credit_quantity )
 
799
 
 
800
        return result
 
801
 
 
802
    def _sum_begin_balance_amount_currency(self):
 
803
        """
 
804
        外币期初余额
 
805
        """
 
806
        result = self._sum_balance_currency_quantiry(date = self.all_dete['period_start_date_start'])
 
807
        return result
 
808
 
 
809
    def _sum_year_balance_amount_currency(self, period):
 
810
        """
 
811
        外币期间、本年余额
 
812
        """
 
813
        result = self._sum_balance_currency_quantiry(date = period['date_stop'])
 
814
        return result
 
815
 
 
816
    def _sum_year_amount_currency(self, period):
 
817
        """
 
818
        外币本年借、贷合计
 
819
        """
 
820
        result = self._sum_amount_currency_quantiry(self.all_dete['fiscalyear_obj_date_start'], period['date_stop'])
 
821
        return result
 
822
 
 
823
    def _sum_amount_currency(self, period):
 
824
        """
 
825
        外币期间借、贷合计
 
826
        """
 
827
        result = self._sum_amount_currency_quantiry(self.all_dete['period_start_date_start'],self.all_dete['period_end_date_stop'])
 
828
        return result
 
829
 
 
830
    def _sum_year_quantity(self, period):
 
831
        """
 
832
        数量本年借、贷合计
 
833
        """
 
834
        result = self._sum_amount_currency_quantiry(self.all_dete['fiscalyear_obj_date_start'], period['date_stop'])
 
835
        return result
 
836
 
 
837
    def _sum_amount_quantity(self, form, period=False):
 
838
        """
 
839
        数量期间借、贷合计
 
840
        """
 
841
        result = self._sum_amount_currency_quantiry( self.all_dete['period_start_date_start'], self.all_dete['period_end_date_stop'])
 
842
        return result
 
843
 
 
844
    def _sum_begin_balance_quantity(self):
 
845
        """
 
846
        数量期初余额
 
847
        """
 
848
        result = self._sum_balance_currency_quantiry(date = self.all_dete['period_start_date_start'])
 
849
        return result
 
850
 
 
851
    def _sum_year_balance_quantity(self,period):
 
852
        """
 
853
        数量期间、本年余额
 
854
        """
 
855
        result = self._sum_balance_currency_quantiry(date = period['date_stop'])
 
856
        return result
 
857
 
 
858
    def _sum_debit(self, form, period=False):
 
859
        """
 
860
        借方期间总计
 
861
        """
 
862
        if not self.ids:
 
863
            return 0.0
 
864
        if period==False:
 
865
            self.cr.execute("SELECT sum(debit) "\
 
866
                "FROM account_move_line l "\
 
867
                "WHERE l.account_id in ("+','.join(map(str, self.child_ids))+") AND "+self.query + " AND l.date < '" +self.all_dete['period_end_date_stop'] + "'" +  " AND l.date > '" + self.all_dete['period_start_date_start'] +"'"+self.sql_condition)
 
868
        else:
 
869
            self.cr.execute("SELECT sum(debit) "\
 
870
                "FROM account_move_line l "\
 
871
                "WHERE l.account_id in ("+','.join(map(str, self.child_ids))+") AND "+self.query + " AND l.date < '" + period['date_stop'] + "'" +  " AND l.date > '" + period['date_start'] +"'"+self.sql_condition)
 
872
        sum_debit = self.cr.fetchone()[0] or 0.0
 
873
        return sum_debit
 
874
 
 
875
    def _sum_credit(self, form, period=False):
 
876
        """
 
877
        贷方期间总计
 
878
        """
 
879
        if not self.ids:
 
880
            return 0.0
 
881
        if period==False:
 
882
            self.cr.execute("SELECT sum(credit) "\
 
883
                "FROM account_move_line l "\
 
884
                "WHERE l.account_id in ("+','.join(map(str, self.child_ids))+") AND "+self.query + " AND l.date < '" +self.all_dete['period_end_date_stop'] + "'" +  " AND l.date > '" + self.all_dete['period_start_date_start'] +"'"+self.sql_condition)
 
885
        else:
 
886
            self.cr.execute("SELECT sum(credit) "\
 
887
                "FROM account_move_line l "\
 
888
                "WHERE l.account_id in ("+','.join(map(str, self.child_ids))+") AND "+self.query + " AND l.date < '" + period['date_stop'] + "'" +  " AND l.date > '" + period['date_start'] +"'"+self.sql_condition)
 
889
        ## Add solde init to the result
 
890
        sum_credit = self.cr.fetchone()[0] or 0.0
 
891
        return sum_credit
 
892
 
 
893
    def _sum_solde(self, form, period=False):
 
894
        """
 
895
        余额期间总计
 
896
        """
 
897
        if not self.ids:
 
898
            return 0.0
 
899
        if period==False:
 
900
             self.cr.execute("SELECT (sum(debit) - sum(credit)) as tot_solde "\
 
901
                "FROM account_move_line l "\
 
902
                "WHERE l.account_id in ("+','.join(map(str, self.child_ids))+") AND "+self.query + " AND l.date < '" +self.all_dete['period_end_date_stop'] + "'" +  " AND l.date > '" + self.all_dete['period_start_date_start'] +"'"+self.sql_condition)
 
903
        else:
 
904
            self.cr.execute("SELECT (sum(debit) - sum(credit)) as tot_solde "\
 
905
                "FROM account_move_line l "\
 
906
                "WHERE l.account_id in ("+','.join(map(str, self.child_ids))+") AND "+self.query + " AND l.date < '" + period['date_stop'] + "'" +  " AND l.date > '" + period['date_start'] +"'"+self.sql_condition)
 
907
        sum_solde = abs(self.cr.fetchone()[0] or 0.0)
 
908
        return sum_solde
 
909
 
 
910
 
 
911
    def _set_get_account_currency_code(self, account_id):
 
912
        self.cr.execute("SELECT c.code as code "\
 
913
                "FROM res_currency c,account_account as ac "\
 
914
                "WHERE ac.id = %s AND ac.currency_id = c.id"%(account_id))
 
915
        result = self.cr.fetchone()
 
916
        if result:
 
917
            self.account_currency = result[0]
 
918
        else:
 
919
            self.account_currency = False
 
920
 
 
921
 
 
922
    def _get_direction(self, balance):
 
923
        #FIXME: 这里估计是错的,还待研判
 
924
        str = ''
 
925
        if balance == 0:
 
926
            str = u'平'
 
927
        elif balance > 0:
 
928
            str = u'借'
 
929
        else:
 
930
            str = u'贷'
 
931
        return str
 
932
 
 
933
    def _get_account_name(self,account):
 
934
        """
 
935
        获取完整的科目名称
 
936
        """
 
937
        id = str(account.id)
 
938
        account_name = self.pool.get('account.account').name_get(self.cr, self.uid, id,{})
 
939
        return account_name[0][1]
 
940
 
 
941
 
 
942
class cash_journal_parser(detail_ledger_parser):
 
943
    """
 
944
    现金日记账报表解析器
 
945
    """
 
946
    def __init__(self, cr, uid, name, context):
 
947
        super(cash_journal_parser, self).__init__(cr, uid, name, context)
 
948
        self.localcontext.update({
 
949
            'days': self.days,
 
950
        })
 
951
 
 
952
    def days(self, account, form, period):
 
953
        """
 
954
        从 account.move.line 里按日期分组
 
955
        也就是把所有的凭证明细的不同日分出来,方便计算单日合计
 
956
        """
 
957
        sql = """
 
958
            SELECT l.date AS date, SUM(l.debit) AS debit, SUM(l.credit) AS credit, MAX(l.id) AS last_line_id, sum(l.amount_currency) AS sum_currency
 
959
                FROM account_move_line AS l
 
960
                       LEFT JOIN res_currency c on (l.currency_id=c.id)
 
961
                          JOIN account_journal j on (l.journal_id=j.id)
 
962
                             AND account_id = %%s
 
963
                             AND %s
 
964
                               WHERE l.date<=%%s
 
965
                               AND l.date>=%%s
 
966
                               GROUP BY l.date
 
967
                               ORDER BY l.date """ % (self.query)
 
968
        max_date = period['date_stop']
 
969
        min_date = period['date_start']
 
970
        self.cr.execute(sql, (account.id, max_date, min_date))
 
971
 
 
972
        res = self.cr.dictfetchall()
 
973
        account_move_line_obj = self.pool.get('account.move.line')
 
974
        for day in res:
 
975
            start_date = ''
 
976
            day['sum_balance_amount_currency'] = (self._sum_balance_currency_quantiry( date = str(day.get('date','')))).get('sum_balance_amount_currency',0.0)
 
977
            day['sum_debit_amount_currency'] = (self._sum_amount_currency_quantiry( start_date = str(day.get('date','')),end_date = str(day.get('date','')))).get('sum_debit_amount_currency',0.0)
 
978
            day['sum_credit_amount_currency'] = (self._sum_amount_currency_quantiry( start_date = str(day.get('date','')),end_date = str(day.get('date','')))).get('sum_credit_amount_currency',0.0)
 
979
            line = self.pool.get('account.move.line').browse(self.cr, self.uid, day['last_line_id'])
 
980
            day['balance'] = abs(line.balance)
 
981
            if(type(day['debit']) == type(None)):
 
982
                day['debit'] = 0.0              # by mrshelly 只是为了报表出来.这里需要处理.
 
983
            if(type(day['credit']) == type(None)):
 
984
                day['credit'] = 0.0             # by mrshelly 只是为了报表出来.这里需要处理.
 
985
 
 
986
        return res
 
987
 
 
988
#注册报表类
 
989
 
 
990
#总帐
 
991
 
 
992
#现金日记帐
 
993
report_sxw.report_sxw('report.account.cash_journal', 'account.account', 'addons/oecn_account_print/report/cash_journal.rml', parser=cash_journal_parser, header=False)
 
994
 
 
995
#外币日记帐
 
996
report_sxw.report_sxw('report.account.foreign_currency_cash_journal', 'account.account', 'addons/oecn_account_print/report/foreign_currency_cash_journal.rml', parser=cash_journal_parser, header=False)
 
997
 
 
998
#三栏明细帐
 
999
report_sxw.report_sxw('report.account.threecolumns_ledger', 'account.account', 'addons/oecn_account_print/report/threecolumns_ledger.rml', parser=detail_ledger_parser, header=False)
 
1000
        
 
1001
#数量金额明细帐
 
1002
report_sxw.report_sxw('report.account.stock_ledger', 'account.account', 'addons/oecn_account_print/report/stock_ledger.odt', parser=detail_ledger_parser, header=False)
 
1003
 
 
1004
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: