Exportando asientos a Contaplus

Y yo que creía que un asiento era eso, algo para sentarse…

 

Este post poco o nada tiene que ver con la temática que he ido llevando en el blog. Trata de un script en python para exportar asientos contables de Lugano (un obsoleto programa de gestión y contabilidad desarrollado en VB7) a Contaplus 2011.

Si bien va a ser muy raro que  alguien necesite exportar de dicho programa a Contaplus, puede servir de referencia a quién necesite exportar desde otro programa, ya que el formato de los ficheros de Contaplus sería exactamente el mismo.

 

Seré breve y conciso, ya que en casos cómo este vale más el código en sí que una explicación detallada y confusa.

Previo estudio de la base de datos origen, estructura de campos y demás, decidí generar un módulo el cual tuviera la asociación de los campos de la bd a líneas de los ficheros de importación de Contaplus.

Dicho módulo luce tal que así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# coding: utf-8
 
fecha_subcuenta = {}
 
def clean(d):
    # prepare the dates
    # encoding??
 
    if not fecha_subcuenta.get(d['ASIENTO']):
        fecha_subcuenta[d['ASIENTO']] = (d['FECHA']).strftime("%Y%m%d")
 
    d['FECHA'] = fecha_subcuenta[d['ASIENTO']]
    #d['FECHA'] = (d['FECHA']).strftime("%Y%m%d")
    #d['CUENTA'] = d['CUENTA'][:7]
    #d['IVA'] = 16.0
    d['FACTURA'] = int(d['FACTURA'][:8]) if d['FACTURA'] else 0
    d['concepto'] = d['concepto'][:25]
    d['DOCUMENTO'] = d['DOCUMENTO'][:10]
    d['blank'] = ''
    d['zero'] = 0.
 
    return d
 
def clean_cuenta(d):
 
    d['blank'] = ''
    d['zero'] = 0.
 
    if d['CODIGO'][:3] == "477":
        d['TIPOIVA'] = "G"
    elif d['CODIGO'][:3] == "472":
        d['TIPOIVA'] = "O"
    else:
        d['TIPOIVA'] = "J"
    d['TITULO'] = d['TITULO'].replace(',','')
    d['TPC'] = 0.
 
    #d['RECEQUIV'] = 0.
 
    return d
 
DIARIO = ( "%(ASIENTO)6d"
    "%(FECHA)s"
    "%(CUENTA)-12s"
    "%(CUENTA)-12s" # contra
    "%(zero)16.2f" # ptadebe
    "%(concepto)-25s"
    "%(zero)16.2f" # ptahaber
    "%(FACTURA)8d" # factura
    "%(BASEIMPO)16.2f"
    "%(IVA)5.2f"
    "%(RECEQUIV)5.2f"
    "%(DOCUMENTO)10s"
    #"%(DEP)3d"
    "%(blank)3s" # departamento
    "%(blank)6s" # clave
    " " # punteo
    "%(zero)6d" # ncasado
    "%(CASADO)1d" # tcasado
    "%(zero)6d" # trans
    "%(zero)16.6f" # cambio
    "%(zero)16.2f" # debeme
    "%(zero)16.2f" # haberme
    "%(blank)1s" # auxiliar
    "%(SERIE)1s" 
    "%(blank)4s"  # surcursal
    "%(blank)5s"  # coddivisa
    "%(zero)16.2f"  # impauxme
    "2"  
    "%(IMPORTED)16.2f" 
    "%(IMPORTEH)16.2f" 
    "%(BASEIMPO)16.2f" 
    "F"  # T/F ??????
    "%(blank)10s"  # numeroinv
    "%(blank)1s"  # serie_rt
    "%(zero)8d" # factu_rt
    "%(zero)16.2f"  # baseimpo_rt
    "%(zero)16.2f"  # baseimpo_rf
    "F"  # rectifica
    "%(blank)8s"  # fecha_rt
    "%(blank)1s"  # nic
    "F"  # libre
    "%(zero)6d"  # libre
    "%(blank)1s"  # interrump
    "%(blank)6s"  # segactiv
    "%(blank)6s"  # seggeog
    "%(blank)1s"  # 1rect349
    "%(blank)8s"  # fecha_op
    "%(blank)8s"  # fecha_ex
    #"%(DEP)5d"
    "%(blank)5s" # departamento5
    "%(FACTURA)10s"
    "%(zero)5.2f" # porcen_ana
    "%(zero)5.2f" # porcen_seg
    "%(zero)6d" # numapunte
    "%(zero)16.2f" # eurototal
    "%(NOMBRE)100s"
    "%(blank)50s" # apellido1
    "%(blank)50s" # apellido2
    "%(blank)1s" # tipoope
    "%(zero)8d" # nfactick
    "%(blank)40s" # numacuini
    "%(blank)40s" # numacufin
    "0" # teridnif
    "%(blank)15s" # ternif
    "%(NOMBRE)40s"# ternom
    "%(blank)9s" # ternif14
    "F" # tbientran
    "%(blank)10s" # tbiencod
    "F" # transinm
    "F" # metal
    "%(zero)16.2f" # metalimp
    "%(blank)12s" # cliente
    "0" # opbienes
    "%(blank)40s" # facturaex
    "%(blank)1s" # tipofac
    "%(blank)1s" # tipoiva
    "%(blank)40s" # guid
    "F" # l340
    "0" # metaleje
    "%(DOCUMENTO)15s"# document15
    )
 
 
CUENTA = ( "%(CODIGO)-12s"
    "%(TITULO)-40s"
    "%(NIF)-15s"
    "%(DOMICILIO)-35s"
    "%(POBLACION)-25s"
    "%(PROVINCIA)-20s"
    "%(CODPOSTAL)-5s"
    "F" # divisa
    "%(blank)5s" #coddivisa
    "F" # documento
    "F" # ajustante
    "%(TIPOIVA)1s"
    "%(blank)9s" # proye
    "%(SUBEQUIV)-12s"
    "%(blank)12s" #subcierre
    "F"
    "%(blank)12s" # segmento
    "%(TPC)5.2f"
    "%(RECEQUIV)5.2f"
    "%(FAX)-15s" # fax
    "%(EMAIL)-50s"
    "%(TITULO)-100s"
    #"1" # idnif
    #"ES" # idnif
    " " # idnif
    "  " # idnif
    "%(blank)9s"
    "%(blank)40s"
    "F"
    "F"
    )
 
 
import md5
def hash(s):
    return md5.new(str(s)).hexdigest()

 

Y finalmente el script que realiza toda la exportación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env python
# coding: utf-8
 
import os,sys,datetime,MySQLdb,time,MySQLdb.cursors,platform
from contaplus_exporter import *
 
DIR = "C:\\Documents and Settings\\Administrador\\Escritorio"
HOST = "192.168.1.23"
USER = "contaplus"
PASSWD = ""
DB = "stela"
COD = "201102"
FILE = os.path.join(DIR,"Diario %s.txt" % COD)
FILE_CNT = os.path.join(DIR,"Subcuentas %s.txt" % COD)
NEWLINE = "\r\n" if platform.system() == "Linux" else "\n"
PASSED_FILE = "C:\\Python27\\passed"
CHECK_PASSED = False
 
# read passed
if CHECK_PASSED:
    PASSED = set()
    if os.path.exists(PASSED_FILE):
        for l in open(PASSED_FILE).readlines():
            l = l.strip('\n')
            if l:
                PASSED.add(l)
 
 
db=MySQLdb.connect(host=HOST,port=3306,user=USER,passwd=PASSWD,db=DB,cursorclass=MySQLdb.cursors.DictCursor)
c = db.cursor()
 
""" subcuentas """
c.execute('SELECT * FROM conta_cuenta_%s order by CODIGO;' % COD)
f = c.fetchone()
out = open(FILE_CNT,"w")
cuentas = set()
while f:
 
    out.write( CUENTA % clean_cuenta(f) + NEWLINE )
 
    cuentas.add(f['CODIGO'])
 
    f = c.fetchone()
 
out.write(unichr(26))
out.close()
 
""" asientos """
c.execute('SELECT * FROM conta_diario_%s WHERE NDIARIO=1 order by ASIENTO;' % COD)
f = c.fetchone()
out = open(FILE,"w")
while f:
 
    if CHECK_PASSED:
        if not str(f['ASIENTO']) in PASSED:
            out.write( DIARIO % clean(f) + NEWLINE )
            open(PASSED_FILE,"a").write(str(f['ASIENTO'])+"\n")
    else:
        out.write( DIARIO % clean(f) + NEWLINE )
 
        if f['CUENTA'] not in cuentas:
            print "Falta cuenta %s en el asiento %d" % (f['CUENTA'],f['ASIENTO'])
 
    f = c.fetchone()
 
out.write(unichr(26))
out.close()
 
db.close()

 

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar de numerosas drogas existe. Kamagra es un remedio usado para tratar varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.

Los comentarios estan cerrados.