Amit Dodiya (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/5.0-opw-381491-Vat_Listing-ado into 
lp:openobject-addons/5.0.

Requested reviews:
  Xavier ALT (OpenERP) (xal-openerp)
  Naresh(OpenERP) (nch-openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/5.0-opw-381491-Vat_Listing-ado/+merge/95353

Hello,

Improve the Vat_List.xml file creation from wizard as per the new VAT format.

Thanks,
Amit
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/5.0-opw-381491-Vat_Listing-ado/+merge/95353
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/5.0-opw-381491-Vat_Listing-ado.
=== modified file 'l10n_be/company.py'
--- l10n_be/company.py	2010-04-06 09:41:18 +0000
+++ l10n_be/company.py	2012-03-01 13:16:18 +0000
@@ -1,7 +1,7 @@
 # -*- encoding: utf-8 -*-
 ##############################################################################
 #
-#    OpenERP, Open Source Management Solution	
+#    OpenERP, Open Source Management Solution    
 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
 #    $Id$
 #
@@ -21,6 +21,8 @@
 ##############################################################################
 
 from osv import osv
+from osv import fields, osv
+
 
 class res_company(osv.osv):
     _inherit = "res.company"
@@ -42,4 +44,16 @@
         return city, post_code, address, country_code
 res_company()
 
+class vat_listing_clients(osv.osv):
+    
+    _name = 'vat.listing.clients'
+    _columns = {
+        'name': fields.char('Client Name', size=32),
+        'vat': fields.char('VAT', size=64),
+        'vat_amount': fields.float('Vat Amount'),
+        'turnover': fields.float('Base Turnover'),
+            }
+vat_listing_clients()
+
+
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== modified file 'l10n_be/wizard/partner_vat_listing.py'
--- l10n_be/wizard/partner_vat_listing.py	2012-02-29 14:14:59 +0000
+++ l10n_be/wizard/partner_vat_listing.py	2012-03-01 13:16:18 +0000
@@ -26,6 +26,8 @@
 import base64
 from tools.translate import _
 import tools
+from osv import fields, osv
+
 
 form = """<?xml version="1.0"?>
 <form string="Select Fiscal Year">
@@ -35,8 +37,6 @@
     <newline/>
     <field name="date_stop"/>
     <newline/>
-    <field name="mand_id" help="Should be provided when subscription of INTERVAT service is done"/>
-    <newline/>
     <field name="limit_amount" help="Limit under which the partners will not be included into the listing"/>
     <newline/>
     <field name="test_xml" help="Set the XML output as test file"/>
@@ -45,42 +45,161 @@
 fields = {
     'date_start': {'string':"Start date",'type':'date','required':True ,'default': lambda *a: time.strftime('%Y-01-01')},
     'date_stop': {'string':"End date",'type':'date','required':True, 'default': lambda *a: time.strftime('%Y-12-31')},
-    'mand_id':{'string':'MandataireId','type':'char','size':'30','required': True,},
     'limit_amount':{'string':'Limit Amount','type':'integer','required': True, },
     'test_xml': {'string':'Test XML file', 'type':'boolean', },
    }
+
 msg_form = """<?xml version="1.0"?>
+               <form string="Select Fiscal Year">
+                    <notebook colspan="4">
+                        <page string="Details">
+                            <label string="You can remove customers which you do not want in exported xml file" colspan="4"/>
+                            <separator string="Customers" colspan="4"/>
+                            <field name="partner_ids" colspan="4" nolabel="1" default_focus="1" height="200" width="500"/>
+                        </page>
+                        <page string="Comments">
+                            <field name="comments" colspan="4" nolabel="1"/>
+                        </page>
+                    </notebook>
+                </form>"""
+
+msg_fields = {
+          'partner_ids': {'string':'Clients','type':'many2many', 'relation':'vat.listing.clients'},
+          'comments': {'string': 'Comments', 'type': 'text', 'size' : 64},
+}
+
+msg_form_new = """<?xml version="1.0"?>
 <form string="Notification">
     <separator string="XML File has been Created."  colspan="4"/>
     <field name="msg" colspan="4" nolabel="1"/>
-    <field name="file_save" />
+    <field name="file" />
 </form>"""
-
-msg_fields = {
+msg_fields_new = {
   'msg': {'string':'File created', 'type':'text', 'size':'100','readonly':True},
-  'file_save':{'string': 'Save File',
+  'file':{'string': 'Save File',
         'type': 'binary',
         'readonly': True,},
 }
 
+
 class wizard_vat(wizard.interface):
+    
+    def _check_data(self, cr, uid, data, context):
+        obj_cmpny = pooler.get_pool(cr.dbname).get('res.users').browse(cr, uid, uid).company_id
+        company_vat = obj_cmpny.partner_id.vat
+        if not company_vat: 
+            raise wizard.except_wizard(_('Data Insufficient'),_('No VAT Number Associated with Main Company!'))
+        
+        domains = [('date_start','>=',data['form']['date_start']),('date_stop','<=',data['form']['date_stop'])]
+        date_stop = data['form']['date_stop']
+        period_ids = pooler.get_pool(cr.dbname).get('account.period').search(cr, uid, domains)
+        if not period_ids:
+            raise wizard.except_wizard(_('Warning !'), _('Please select the proper Start date and End Date'))        
+        return data['form']
+
+    def _get_partner(self, cr, uid, data, context=None):
+        domains = [('date_start','>=',data['form']['date_start']),('date_stop','<=',data['form']['date_stop'])]
+        date_stop = data['form']['date_stop']
+        period_ids = pooler.get_pool(cr.dbname).get('account.period').search(cr, uid, domains)
+        obj_partner = pooler.get_pool(cr.dbname).get('res.partner')
+        obj_vat_lclient = pooler.get_pool(cr.dbname).get('vat.listing.clients')
+        domains = [('date_start','>=',data['form']['date_start']),('date_stop','<=',data['form']['date_stop'])]
+        period_ids = pooler.get_pool(cr.dbname).get('account.period').search(cr, uid, domains)
+
+        if context.get('company_id', False):
+            company_id = context['company_id']
+        else:
+            company_id = pooler.get_pool(cr.dbname).get('res.users').browse(cr, uid, uid, context=context).company_id.id
+
+        partners = []
+        partner_ids = obj_partner.search(cr, uid, [('vat_subjected', '!=', False), ('vat','ilike','BG%')], context=context)
+        cr.execute("""SELECT sub1.partner_id, sub1.name, sub1.vat, sub1.turnover, sub2.vat_amount
+                FROM (SELECT l.partner_id, p.name, p.vat, SUM(CASE WHEN c.code ='49' THEN -l.tax_amount ELSE l.tax_amount END) as turnover
+                      FROM account_move_line l
+                      LEFT JOIN res_partner p ON l.partner_id = p.id
+                      LEFT JOIN account_tax_code c ON l.tax_code_id = c.id
+                      WHERE c.code IN ('01','02','03','45','49')
+                      AND l.partner_id IN %s
+                      AND l.period_id IN %s
+                      GROUP BY l.partner_id, p.name, p.vat) AS sub1
+                LEFT JOIN (SELECT l2.partner_id, SUM(CASE WHEN c2.code ='64' THEN -l2.tax_amount ELSE l2.tax_amount END) as vat_amount
+                      FROM account_move_line l2
+                      LEFT JOIN account_tax_code c2 ON l2.tax_code_id = c2.id
+                      WHERE c2.code IN ('54','64')
+                      AND l2.partner_id IN %s 
+                      AND l2.period_id IN %s
+                      GROUP BY l2.partner_id) AS sub2 ON sub1.partner_id = sub2.partner_id
+                    """,(tuple(partner_ids),tuple(period_ids),tuple(partner_ids),tuple(period_ids)))
+        for record in cr.dictfetchall():
+            record['vat'] = record['vat'].replace(' ','').upper()
+            if record['turnover'] >= data['limit_amount']:
+                id_client = obj_vat_lclient.create(cr, uid, record, context=context)
+                partners.append(id_client)
+        data['form']['partner_ids'] = partners
+        return data['form']
+
+    def _get_datas(self, cr, uid, data, context=None):
+        obj_vat_lclient = pooler.get_pool(cr.dbname).get('vat.listing.clients')
+        datas = []
+        for partner in data['form']['partner_ids']:
+            if isinstance(partner, list) and partner:
+                datas.append(partner[2])
+            else:
+                client_data = obj_vat_lclient.browse(cr, uid, partner[2])
+                for i in client_data:
+                    datas.append(i)
+
+        seq=0
+        data_clientinfo=''
+        data_decl = ''
+        sum_tax=0.00
+        sum_turnover=0.00
+        client_datas = []
+        for line in datas:
+            if not line['vat']:
+                raise wizard.except_wizard(_('Warning !'), _("Missing VAT ,Partner does not have a vat number"))
+            vat_issued = line['vat'][:2]
+            if vat_issued == 'BE':
+                vat_issued = ''
+            else:
+                vat_issued = vat_issued
+            if line['turnover'] < data['form']['limit_amount']:
+                continue
+            seq +=1
+            sum_tax +=line['vat_amount']
+            sum_turnover +=line['turnover']
+            vat = line['vat'].replace(' ','').upper()
+            client_datas.append({
+                           'seq': str(seq),
+                            'vat': vat,
+                            'only_vat': vat[2:],
+                            'turnover': '%.2f' %line['turnover'],
+                            'vat_amount': '%.2f' %line['vat_amount'],
+                            'sum_tax': '%.2f' %sum_tax,
+                            'sum_turnover': '%.2f' %sum_turnover,
+                            'partner_name': line['name'],
+                           })
+        return client_datas
 
     def _create_xml(self, cr, uid, data, context):
         datas=[]
-        seq_controlref = pooler.get_pool(cr.dbname).get('ir.sequence').get(cr, uid,'controlref')
         seq_declarantnum = pooler.get_pool(cr.dbname).get('ir.sequence').get(cr, uid,'declarantnum')
         obj_cmpny = pooler.get_pool(cr.dbname).get('res.users').browse(cr, uid, uid).company_id
+        obj_vat_lclient = pooler.get_pool(cr.dbname).get('vat.listing.clients')
+        
         company_vat = obj_cmpny.partner_id.vat
         if not company_vat: 
             raise wizard.except_wizard(_('Data Insufficient'),_('No VAT Number Associated with Main Company!'))
 
-        cref = company_vat + seq_controlref
-        dnum = cref + seq_declarantnum
-
+        dnum = company_vat[2:] + seq_declarantnum[-4:]
         p_id_list = pooler.get_pool(cr.dbname).get('res.partner').search(cr,uid,[('vat_subjected','!=',False)])
         if not p_id_list:
              raise wizard.except_wizard(_('Data Insufficient!'),_('No partner has a VAT Number associated with him.'))
         domains = [('date_start','>=',data['form']['date_start']),('date_stop','<=',data['form']['date_stop'])]
+        dnum = company_vat[2:] + seq_declarantnum[-4:]
+        company_vat = company_vat.replace(' ','').upper()
+        SenderId = company_vat[2:]
+        issued_by = company_vat[:2]
         date_stop = data['form']['date_stop']
         period_ids = pooler.get_pool(cr.dbname).get('account.period').search(cr, uid, domains)
         if not period_ids:
@@ -91,8 +210,10 @@
         addr = pooler.get_pool(cr.dbname).get('res.partner').address_get(cr, uid, [obj_cmpny.partner_id.id], ['invoice'])
         if addr.get('invoice',False):
             ads=pooler.get_pool(cr.dbname).get('res.partner.address').browse(cr,uid,[addr['invoice']])[0]     
-                
+            email = ads.email or ''
+            phone = ads.phone or ''    
             zip_city = pooler.get_pool(cr.dbname).get('res.partner.address').get_city(cr,uid,ads.id)
+            zip = pooler.get_pool(cr.dbname).get('res.partner.address').browse(cr, uid, ads.id, context=context).zip or ''
             if not zip_city:
                 zip_city = ''
             if ads.street:
@@ -103,106 +224,96 @@
                 country = ads.country_id.code
 
         sender_date = time.strftime('%Y-%m-%d')
+        
+        annual_listing_data = {
+                               'issued_by': issued_by,
+                               'company_vat': company_vat,
+                               'comp_name': obj_cmpny.name,
+                               'street': street,
+                               'zip': zip,
+                               'city': zip_city,
+                               'country': country,
+                               'email': email,
+                               'phone': phone,
+                               'SenderId': SenderId,
+                               'period': date_stop[:4],
+                               'comments': data['form']['comments'] or ''
+                               }
+        
         comp_name = obj_cmpny.name
-        data_file = '<?xml version="1.0"?>\n<VatList xmlns="http://www.minfin.fgov.be/VatList"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="http://www.minfin.fgov.be/VatList VatList.xml" RecipientId="VAT-ADMIN" SenderId="'+ str(company_vat) + '"'
-        data_file +=' ControlRef="'+ cref + '" MandataireId="'+ data['form']['mand_id'] + '" SenderDate="'+ str(sender_date)+ '"'
-        if data['form']['test_xml']:
-            data_file += ' Test="0"'
-        data_file += ' VersionTech="1.2">'
-        data_file += '\n<AgentRepr DecNumber="1">\n\t<CompanyInfo>\n\t\t<VATNum>'+str(company_vat)+'</VATNum>\n\t\t<Name>'+ comp_name +'</Name>\n\t\t<Street>'+ street +'</Street>\n\t\t<CityAndZipCode>'+ zip_city +'</CityAndZipCode>'
-        data_file += '\n\t\t<Country>'+ country +'</Country>\n\t</CompanyInfo>\n</AgentRepr>'
-        data_comp = '\n<CompanyInfo>\n\t<VATNum>'+str(company_vat)+'</VATNum>\n\t<Name>'+ comp_name +'</Name>\n\t<Street>'+ street +'</Street>\n\t<CityAndZipCode>'+ zip_city +'</CityAndZipCode>\n\t<Country>'+ country +'</Country>\n</CompanyInfo>'
-        data_period = '\n<Period>'+ date_stop[:4] +'</Period>'
-        error_message = []
-
-        for p_id in p_id_list:
-            record = {} # this holds record per partner
-            obj_partner = pooler.get_pool(cr.dbname).get('res.partner').browse(cr,uid,p_id)
-            
-            #This listing is only for customers located in belgium, that's the 
-            #reason why we skip all the partners that haven't their 
-            #(or one of their) default address(es) located in Belgium.
-            go_ahead = False
-            for ads in obj_partner.address:
-                if ads.type == 'default' and (ads.country_id and ads.country_id.code == 'BE'):
-                    go_ahead = True
-                    break
-            if not go_ahead:
-                continue
-            query = 'select b.code,sum(credit)-sum(debit) from account_move_line l left join account_account a on (l.account_id=a.id) left join account_account_type b on (a.user_type=b.id) where b.code in ('"'produit'"','"'tax'"') and l.partner_id='+str(p_id)+' and l.period_id in '+period+' group by b.code'
-            cr.execute(query)
-            line_info = cr.fetchall()
-            if not line_info:
-                continue
-
-            record['name'] = obj_partner.name
-            record['vat'] = obj_partner.vat
-
-            #it seems that this listing is only for belgian customers
-            record['country'] = 'BE'
-
-            #...deprecated...
-            #~addr = pooler.get_pool(cr.dbname).get('res.partner').address_get(cr, uid, [obj_partner.id], ['invoice'])
-            
-            #~ if addr.get('invoice',False):
-                #~ads=pooler.get_pool(cr.dbname).get('res.partner.address').browse(cr,uid,[addr['invoice']])[0] 
-            
-                #~ if ads.country_id:
-                    #~ record.append(ads.country_id.code)
-                #~ else:
-                    #~ error_message.append('Data Insufficient! : '+ 'The Partner "'+obj_partner.name + '"'' has no country associated with its Invoice address!')
-                    
-            #~ if len(record)<2:
-                #~ record.append('')
-                #~ error_message.append('Data Insufficient! : '+ 'The Partner "'+obj_partner.name + '"'' has no Invoice address!')
-
-            record['amount'] = 0
-            record['turnover'] = 0
-
-            for item in line_info:
-                if item[0]=='produit':
-                    record['turnover'] += item[1]
-                else:
-                    record['amount'] += item[1]
-            datas.append(record)
-
-        seq=0
-        data_clientinfo=''
-        sum_tax=0.00
-        sum_turnover=0.00
-        if len(error_message):
-            data['form']['msg']='Exception : \n' +'-'*50+'\n'+ '\n'.join(error_message)
-            return data['form']
-        for line in datas:
-            if line['turnover'] < data['form']['limit_amount']:
-                continue
-            seq +=1
-            sum_tax +=line['amount']
-            sum_turnover +=line['turnover']
-            if not line['vat']:
-                raise wizard.except_wizard(_('Warning !'), _("Missing VAT ,Partner %s does not have a vat number") % line['name'])
-            if not line['country']:
-                raise wizard.except_wizard(_('Warning !'), _("Missing Country ,Partner %s does not have a country") % line['name'])
-            
-            data_clientinfo +='\n<ClientList SequenceNum="'+str(seq)+'">\n\t<CompanyInfo>\n\t\t<VATNum>'+line['vat'] +'</VATNum>\n\t\t<Country>'+tools.ustr(line['country']) +'</Country>\n\t</CompanyInfo>\n\t<Amount>'+str(int(line['amount'] * 100)) +'</Amount>\n\t<TurnOver>'+str(int(line['turnover'] * 100)) +'</TurnOver>\n</ClientList>'
-
-        data_decl ='\n<DeclarantList SequenceNum="1" DeclarantNum="'+ dnum + '" ClientNbr="'+ str(seq) +'" TurnOverSum="'+ str(int(sum_turnover * 100)) +'" TaxSum="'+ str(int(sum_tax * 100)) +'" />'
-        data_file += data_decl + data_comp + str(data_period) + data_clientinfo + '\n</VatList>'
-
+        data_file = """<?xml version="1.0"?>
+    <ns2:ClientListingConsignment xmlns="http://www.minfin.fgov.be/InputCommon"; xmlns:ns2="http://www.minfin.fgov.be/ClientListingConsignment"; ClientListingsNbr="1">
+    <ns2:Representative>
+        <RepresentativeID identificationType="NVAT" issuedBy="%(issued_by)s">%(SenderId)s</RepresentativeID>
+        <Name>%(comp_name)s</Name>
+        <Street>%(street)s</Street>
+        <PostCode>%(zip)s</PostCode>
+        <City>%(city)s</City>"""
+        if annual_listing_data['country']:
+            data_file +="\n\t\t<CountryCode>%(country)s</CountryCode>"
+        data_file += """
+        <EmailAddress>%(email)s</EmailAddress>
+        <Phone>%(phone)s</Phone>
+    </ns2:Representative>"""
+        data_file = data_file % annual_listing_data
+        data_comp = """
+        <ns2:Declarant>
+            <VATNumber>%(SenderId)s</VATNumber>
+            <Name>%(comp_name)s</Name>
+            <Street>%(street)s</Street>
+            <PostCode>%(zip)s</PostCode> 
+            <City>%(city)s</City> 
+            <CountryCode>%(country)s</CountryCode> 
+            <EmailAddress>%(email)s</EmailAddress> 
+            <Phone>%(phone)s</Phone> 
+        </ns2:Declarant>
+        <ns2:Period>%(period)s</ns2:Period>
+        """ % annual_listing_data
+
+        client_datas = self._get_datas(cr, uid, data, context=context)
+        if client_datas == []:
+            raise wizard.except_wizard(_('Warning !'), _("No data for Vat Listing file creation"))
+        data_client_info = ''
+        for amount_data in client_datas:
+            data_client_info += """
+                    <ns2:Client SequenceNumber="%(seq)s">
+                        <ns2:CompanyVATNumber issuedBy="BE">%(only_vat)s</ns2:CompanyVATNumber>
+                        <ns2:TurnOver>%(turnover)s</ns2:TurnOver>
+                        <ns2:VATAmount>%(vat_amount)s</ns2:VATAmount>
+                    </ns2:Client>""" % amount_data
+
+        amount_data_begin = client_datas[-1]
+        amount_data_begin.update({'dnum':dnum})
+        data_begin = """
+                    <ns2:ClientListing SequenceNumber="1" ClientsNbr="%(seq)s" DeclarantReference="%(dnum)s"
+                    TurnOverSum="%(sum_turnover)s" VATAmountSum="%(sum_tax)s">
+                """ % amount_data_begin
+
+        data_end = """
+                    <ns2:Comment>%(comments)s</ns2:Comment>
+                    </ns2:ClientListing>
+                    </ns2:ClientListingConsignment>
+            """ % annual_listing_data
+            
+        data_file += data_begin + data_comp + data_client_info + data_end 
         data['form']['msg'] = 'Save the File with '".xml"' extension.'
-        data['form']['file_save'] = base64.encodestring(data_file.encode('utf8'))
+        data['form']['name'] = 'vat_list.xml'
+        data['form']['file'] = base64.encodestring(data_file.encode('utf8'))
         return data['form']
 
     states = {
         'init': {
             'actions': [],
-            'result': {'type':'form', 'arch':form, 'fields':fields, 'state':[('end','Cancel'),('go','Create XML')]},
+            'result': {'type':'form', 'arch':form, 'fields':fields, 'state':[('end','Cancel'),('go','View Client')]},
         },
         'go': {
+            'actions': [_check_data,_get_partner],
+            'result': {'type': 'form', 'arch':msg_form, 'fields':msg_fields, 'state':[('end','Close'),('create_file','Create XML')]}
+        },
+        'create_file': {
             'actions': [_create_xml],
-            'result': {'type':'form', 'arch':msg_form, 'fields':msg_fields, 'state':[('end','Ok')]},
+            'result': {'type': 'form', 'arch':msg_form_new, 'fields':msg_fields_new, 'state':[('end','Close')]} 
         }
-
     }
 
 wizard_vat('list.vat.detail')

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to