2009-10-14 11:15:34 +00:00
# -*- coding: utf-8 -*-
2009-03-24 11:01:43 +00:00
##############################################################################
2010-04-01 13:38:12 +00:00
#
2009-10-14 11:15:34 +00:00
# OpenERP, Open Source Management Solution
2010-01-12 09:18:39 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
2009-03-24 11:01:43 +00:00
#
2009-10-14 11:15:34 +00:00
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
2009-03-24 11:01:43 +00:00
#
2009-10-14 11:15:34 +00:00
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
2009-03-24 11:01:43 +00:00
#
2009-10-14 11:15:34 +00:00
# You should have received a copy of the GNU Affero General Public License
2010-04-01 13:38:12 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2009-03-24 11:01:43 +00:00
#
##############################################################################
import time
import base64
2010-04-02 04:32:42 +00:00
from osv import osv , fields
2010-05-04 11:49:34 +00:00
from tools . translate import _
2011-12-06 11:37:11 +00:00
from report import report_sxw
2010-04-01 13:38:12 +00:00
class partner_vat_intra ( osv . osv_memory ) :
2010-05-04 11:49:34 +00:00
"""
Partner Vat Intra
"""
2010-04-01 13:38:12 +00:00
_name = " partner.vat.intra "
2010-04-02 04:32:42 +00:00
_description = ' Partner VAT Intra '
2010-04-01 13:38:12 +00:00
2010-06-11 07:04:25 +00:00
def _get_xml_data ( self , cr , uid , context = None ) :
2010-06-10 13:03:02 +00:00
if context . get ( ' file_save ' , False ) :
2010-08-23 19:49:16 +00:00
return base64 . encodestring ( context [ ' file_save ' ] . encode ( ' utf8 ' ) )
2010-06-11 07:04:25 +00:00
return ' '
2010-04-01 13:38:12 +00:00
2010-05-04 11:54:31 +00:00
def _get_europe_country ( self , cursor , user , context = None ) :
return self . pool . get ( ' res.country ' ) . search ( cursor , user , [ ( ' code ' , ' in ' , [ ' AT ' , ' BG ' , ' CY ' , ' CZ ' , ' DK ' , ' EE ' , ' FI ' , ' FR ' , ' DE ' , ' GR ' , ' HU ' , ' IE ' , ' IT ' , ' LV ' , ' LT ' , ' LU ' , ' MT ' , ' NL ' , ' PL ' , ' PT ' , ' RO ' , ' SK ' , ' SI ' , ' ES ' , ' SE ' , ' GB ' ] ) ] )
2010-04-01 13:38:12 +00:00
_columns = {
2010-05-04 11:49:34 +00:00
' name ' : fields . char ( ' File Name ' , size = 32 ) ,
2010-04-11 19:31:52 +00:00
' period_code ' : fields . char ( ' Period Code ' , size = 6 , required = True , help = ''' This is where you have to set the period code for the intracom declaration using the format: ppyyyy
PP can stand for a month : from ' 01 ' to ' 12 ' .
PP can stand for a trimester : ' 31 ' , ' 32 ' , ' 33 ' , ' 34 '
The first figure means that it is a trimester ,
The second figure identify the trimester .
PP can stand for a complete fiscal year : ' 00 ' .
YYYY stands for the year ( 4 positions ) .
'''
) ,
' period_ids ' : fields . many2many ( ' account.period ' , ' account_period_rel ' , ' acc_id ' , ' period_id ' , ' Period (s) ' , help = ' Select here the period(s) you want to include in your intracom declaration ' ) ,
2010-06-14 09:17:41 +00:00
' tax_code_id ' : fields . many2one ( ' account.tax.code ' , ' Tax Code ' , domain = [ ( ' parent_id ' , ' = ' , False ) ] ) ,
2010-04-01 13:38:12 +00:00
' test_xml ' : fields . boolean ( ' Test XML file ' , help = " Sets the XML output as test file " ) ,
' mand_id ' : fields . char ( ' MandataireId ' , size = 14 , required = True , help = " This identifies the representative of the sending company. This is a string of 14 characters " ) ,
2010-05-04 11:49:34 +00:00
' msg ' : fields . text ( ' File created ' , size = 14 , readonly = True ) ,
' no_vat ' : fields . text ( ' Partner With No VAT ' , size = 14 , readonly = True , help = " The Partner whose VAT number is not defined they doesn ' t include in XML File. " ) ,
2010-04-01 13:38:12 +00:00
' file_save ' : fields . binary ( ' Save File ' , readonly = True ) ,
' country_ids ' : fields . many2many ( ' res.country ' , ' vat_country_rel ' , ' vat_id ' , ' country_id ' , ' European Countries ' ) ,
2010-04-02 04:32:42 +00:00
}
2010-04-01 13:38:12 +00:00
_defaults = {
' country_ids ' : _get_europe_country ,
2010-06-10 13:03:02 +00:00
' file_save ' : _get_xml_data ,
2010-06-11 07:04:25 +00:00
' name ' : ' vat_Intra.xml ' ,
2010-08-23 19:49:16 +00:00
}
2010-04-01 13:38:12 +00:00
2011-12-06 11:11:19 +00:00
def _get_datas ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
2010-04-01 13:38:12 +00:00
obj_user = self . pool . get ( ' res.users ' )
obj_sequence = self . pool . get ( ' ir.sequence ' )
obj_partner = self . pool . get ( ' res.partner ' )
obj_partner_add = self . pool . get ( ' res.partner.address ' )
2011-12-06 11:11:19 +00:00
xmldict = { }
2010-05-04 11:49:34 +00:00
street = zip_city = country = p_list = data_clientinfo = ' '
seq = amount_sum = 0
2010-05-04 11:54:31 +00:00
2011-12-06 11:11:19 +00:00
wiz_data = self . browse ( cr , uid , ids [ 0 ] , context = context )
if wiz_data . tax_code_id :
data_cmpny = wiz_data . tax_code_id . company_id
2010-06-14 07:20:12 +00:00
else :
2011-12-06 11:11:19 +00:00
data_cmpny = obj_user . browse ( cr , uid , uid , context = context ) . company_id
# Get Company vat
2011-09-27 13:04:44 +00:00
company_vat = data_cmpny . partner_id . vat
2009-03-24 11:01:43 +00:00
if not company_vat :
2010-04-01 13:38:12 +00:00
raise osv . except_osv ( _ ( ' Data Insufficient ' ) , _ ( ' No VAT Number Associated with Main Company! ' ) )
2011-09-27 13:04:44 +00:00
company_vat = company_vat . replace ( ' ' , ' ' ) . upper ( )
2009-03-24 11:01:43 +00:00
2011-12-06 11:11:19 +00:00
if len ( wiz_data . period_code ) != 6 :
raise osv . except_osv ( _ ( ' Wrong Period Code ' ) , _ ( ' The period code you entered is not valid. ' ) )
if not wiz_data . period_ids :
raise osv . except_osv ( _ ( ' Data Insufficient! ' ) , _ ( ' Please select at least one Period. ' ) )
p_id_list = obj_partner . search ( cr , uid , [ ( ' vat ' , ' != ' , False ) ] , context = context )
if not p_id_list :
raise osv . except_osv ( _ ( ' Data Insufficient! ' ) , _ ( ' No partner has a VAT Number asociated with him. ' ) )
seq_controlref = obj_sequence . get ( cr , uid , ' controlref ' )
seq_declarantnum = obj_sequence . get ( cr , uid , ' declarantnum ' )
2010-04-11 19:31:52 +00:00
cref = company_vat [ 2 : ] + seq_controlref [ - 4 : ]
dnum = cref + seq_declarantnum [ - 5 : ]
2009-03-24 11:01:43 +00:00
2011-12-06 11:11:19 +00:00
addr = obj_partner . address_get ( cr , uid , [ data_cmpny . partner_id . id ] , [ ' invoice ' ] )
2009-03-24 11:01:43 +00:00
if addr . get ( ' invoice ' , False ) :
2011-12-06 11:11:19 +00:00
ads = obj_partner_add . browse ( cr , uid , [ addr [ ' invoice ' ] ] ) [ 0 ]
2009-03-24 11:01:43 +00:00
zip_city = ( ads . city or ' ' ) + ' ' + ( ads . zip or ' ' )
if zip_city == ' ' :
zip_city = ' '
if ads . street :
street = ads . street
if ads . street2 :
street + = ' '
street + = ads . street2
if ads . country_id :
country = ads . country_id . code
2011-12-06 11:11:19 +00:00
xmldict . update ( {
' company_name ' : data_cmpny . name ,
' company_vat ' : company_vat ,
' vatnum ' : company_vat [ 2 : ] ,
' controlref ' : seq_controlref ,
' cref ' : cref ,
' mand_id ' : wiz_data . mand_id ,
' sender_date ' : str ( time . strftime ( ' % Y- % m- %d ' ) ) ,
' street ' : street ,
' zip_city ' : zip_city ,
' country ' : country ,
' period ' : wiz_data . period_code ,
' clientlist ' : [ ]
} )
2011-05-06 08:43:27 +00:00
codes = ( ' 44 ' , ' 46L ' , ' 46T ' )
2011-12-06 11:11:19 +00:00
cr . execute ( ''' SELECT p.name As partner_name, l.partner_id AS partner_id, p.vat AS vat, t.code AS intra_code, SUM(l.tax_amount) AS amount
2010-05-04 11:49:34 +00:00
FROM account_move_line l
LEFT JOIN account_tax_code t ON ( l . tax_code_id = t . id )
LEFT JOIN res_partner p ON ( l . partner_id = p . id )
2011-05-06 08:43:27 +00:00
WHERE t . code IN % s
2010-05-04 11:49:34 +00:00
AND l . period_id IN % s
2011-12-06 11:11:19 +00:00
GROUP BY p . name , l . partner_id , p . vat , t . code ''' , (codes, tuple([p.id for p in wiz_data.period_ids])))
2011-12-06 11:38:34 +00:00
p_count = 0
2011-12-06 11:11:19 +00:00
for row in cr . dictfetchall ( ) :
2010-05-04 11:49:34 +00:00
if not row [ ' vat ' ] :
p_list + = str ( row [ ' partner_name ' ] ) + ' , '
2011-12-06 11:38:34 +00:00
p_count + = 1
2010-05-04 11:49:34 +00:00
continue
2011-12-06 11:11:19 +00:00
2009-03-24 11:01:43 +00:00
seq + = 1
2010-04-11 19:31:52 +00:00
amt = row [ ' amount ' ] or 0
2010-11-08 17:44:07 +00:00
amt = int ( round ( amt * 100 ) )
2009-03-24 11:01:43 +00:00
amount_sum + = amt
2011-12-06 11:11:19 +00:00
2011-05-06 08:43:27 +00:00
intra_code = row [ ' intra_code ' ] == ' 44 ' and ' S ' or ( row [ ' intra_code ' ] == ' 46L ' and ' L ' or ( row [ ' intra_code ' ] == ' 46T ' and ' T ' or ' ' ) )
# intra_code = row['intra_code'] == '88' and 'L' or (row['intra_code'] == '44b' and 'T' or (row['intra_code'] == '44a' and 'S' or ''))
2011-12-06 11:11:19 +00:00
xmldict [ ' clientlist ' ] . append ( {
2011-12-06 11:37:11 +00:00
' partner_name ' : row [ ' partner_name ' ] ,
2011-12-06 11:11:19 +00:00
' seq ' : seq ,
' vatnum ' : row [ ' vat ' ] [ 2 : ] . replace ( ' ' , ' ' ) . upper ( ) ,
2011-12-06 11:38:34 +00:00
' vat ' : row [ ' vat ' ] ,
2011-12-06 11:11:19 +00:00
' country ' : row [ ' vat ' ] [ : 2 ] ,
' amount ' : amt ,
2011-12-06 11:38:34 +00:00
' intra_code ' : row [ ' intra_code ' ] ,
2011-12-06 11:11:19 +00:00
' code ' : intra_code } )
2011-12-06 11:38:34 +00:00
xmldict . update ( { ' dnum ' : dnum , ' clientnbr ' : str ( seq ) , ' amountsum ' : amount_sum , ' partner_wo_vat ' : p_count } )
2011-12-06 11:11:19 +00:00
return xmldict
def create_xml ( self , cursor , user , ids , context = None ) :
mod_obj = self . pool . get ( ' ir.model.data ' )
xml_data = self . _get_datas ( cursor , user , ids , context = context )
data_file = ' '
data_head = """ <?xml version= " 1.0 " ?>
< VatIntra xmlns = " http://www.minfin.fgov.be/VatIntra " xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance " RecipientId = " VAT-ADMIN " SenderId = " %(company_vat)s " ControlRef = " %(controlref)s " MandataireId = " %(mand_id)s " SenderDate = " %(sender_date)s " VersionTech = " 1.3 " >
< AgentRepr DecNumber = " 1 " >
< CompanyInfo >
< VATNum > % ( company_vat ) s < / VATNum >
< Name > % ( company_name ) s < / Name >
< Street > % ( street ) s < / Street >
< CityAndZipCode > % ( zip_city ) s < / CityAndZipCode >
< Country > % ( country ) s < / Country >
< / CompanyInfo >
< / AgentRepr > """ % (xml_data)
data_comp_period = ' \n \t \t <CompanyInfo> \n \t \t \t <VATNum> %(vatnum)s </VATNum> \n \t \t \t <Name> %(company_name)s </Name> \n \t \t \t <Street> %(street)s </Street> \n \t \t \t <CityAndZipCode> %(zip_city)s </CityAndZipCode> \n \t \t \t <Country> %(country)s </Country> \n \t \t </CompanyInfo> \n \t \t <Period> %(period)s </Period> ' % ( xml_data )
data_clientinfo = ' '
for client in xml_data [ ' clientlist ' ] :
data_clientinfo + = ' \n \t \t <ClientList SequenceNum= " %(seq)s " > \n \t \t \t <CompanyInfo> \n \t \t \t \t <VATNum> %(vatnum)s </VATNum> \n \t \t \t \t <Country> %(country)s </Country> \n \t \t \t </CompanyInfo> \n \t \t \t <Amount> %(amount)s </Amount> \n \t \t \t <Code> %(code)s </Code> \n \t \t </ClientList> ' % ( client )
data_decl = ' \n \t <DeclarantList SequenceNum= " 1 " DeclarantNum= " %(dnum)s " ClientNbr= " %(clientnbr)s " AmountSum= " %(amountsum)s " > ' % ( xml_data )
data_file + = data_head + data_decl + data_comp_period + data_clientinfo + ' \n \t </DeclarantList> \n </VatIntra> '
2010-06-10 13:03:02 +00:00
context [ ' file_save ' ] = data_file
2011-12-06 11:11:19 +00:00
2011-12-06 11:37:11 +00:00
model_data_ids = mod_obj . search ( cursor , user , [ ( ' model ' , ' = ' , ' ir.ui.view ' ) , ( ' name ' , ' = ' , ' view_vat_intra_save ' ) ] , context = context )
resource_id = mod_obj . read ( cursor , user , model_data_ids , fields = [ ' res_id ' ] , context = context ) [ 0 ] [ ' res_id ' ]
2011-12-06 11:11:19 +00:00
2010-06-10 13:03:02 +00:00
return {
' name ' : _ ( ' Save ' ) ,
' context ' : context ,
' view_type ' : ' form ' ,
' view_mode ' : ' form ' ,
' res_model ' : ' partner.vat.intra ' ,
2011-12-06 11:37:11 +00:00
' views ' : [ ( resource_id , ' form ' ) ] ,
2010-06-10 13:03:02 +00:00
' view_id ' : ' view_vat_intra_save ' ,
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
}
2010-04-01 13:38:12 +00:00
2011-12-06 11:37:11 +00:00
def preview ( self , cr , uid , ids , context = None ) :
xml_data = self . _get_datas ( cr , uid , ids , context = context )
datas = {
' ids ' : [ ] ,
' model ' : ' partner.vat.intra ' ,
' form ' : xml_data
}
return {
' type ' : ' ir.actions.report.xml ' ,
' report_name ' : ' partner.vat.intra.print ' ,
' datas ' : datas ,
}
2011-12-06 11:11:19 +00:00
2010-04-01 13:38:12 +00:00
partner_vat_intra ( )
2011-12-06 11:37:11 +00:00
class vat_intra_print ( report_sxw . rml_parse ) :
def __init__ ( self , cr , uid , name , context ) :
super ( vat_intra_print , self ) . __init__ ( cr , uid , name , context = context )
self . localcontext . update ( {
' time ' : time ,
} )
report_sxw . report_sxw ( ' report.partner.vat.intra.print ' , ' partner.vat.intra ' , ' addons/l10n_be/wizard/l10n_be_vat_intra_print.rml ' , parser = vat_intra_print )
2010-11-08 17:44:07 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: