Country, Subdivision and City for Colombia

This commit is contained in:
Alnus Tmp 2020-11-08 22:18:37 -05:00
parent 8c4f584b7a
commit f527c562e6
19 changed files with 15572 additions and 0 deletions

View File

@ -1,10 +1,17 @@
from trytond.pool import Pool
from . import party
from . import country
__all__ = ['register']
def register():
Pool.register(
party.Party,
party.PartyIdentifier,
party.Address,
country.Subdivision,
country.City,
module='account_co_co', type_='model')
Pool.register(
module='account_co_co', type_='wizard')

12
address.xml Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.ui.view" id="address_view_tree">
<field name="model">party.address</field>
<field name="inherit" ref="party.address_view_form"/>
<field name="name">address_form</field>
</record>
</data>
</tryton>

55
country.py Normal file
View File

@ -0,0 +1,55 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model import ModelView, ModelSQL, fields, DeactivableMixin
from trytond.pool import PoolMeta, Pool
from trytond.pyson import Eval
from trytond.transaction import Transaction
__all__ = ['Subdivision', 'City']
class Subdivision(ModelSQL, ModelView):
"Subdivision"
__metaclass__ = PoolMeta
__name__ = 'country.subdivision'
city = fields.One2Many('country.city', 'subdivision', 'Citys')
dane_code = fields.Char('Codigo Dane',
help="Codigo Dane, usado en Colombia"
)
class City(DeactivableMixin, ModelSQL, ModelView):
"City"
__name__ = 'country.city'
subdivision = fields.Many2One('country.subdivision', 'Subdivision',
required=True, select=True,
help="The suddivision where this City is.")
name = fields.Char('Name', required=True, select=True, translate=True,
help="The main identifier of the City.")
code = fields.Char('Code', required=True, select=True,
help="The ISO code of the City.")
dane_code = fields.Char('Codigo Dane',
help="Codigo Dane, usado en Colombia"
)
@classmethod
def __setup__(cls):
super(City, cls).__setup__()
cls._order.insert(0, ('code', 'ASC'))
@classmethod
def __register__(cls, module_name):
pool = Pool()
Data = pool.get('ir.model.data')
data = Data.__table__()
cursor = Transaction().connection.cursor()
super().__register__(module_name)
cursor.execute(*data.delete(where=(data.module == 'subdivision')
& (data.model == cls.__name__)))

210
departamentos_colombia.xml Normal file
View File

@ -0,0 +1,210 @@
<?xml version="1.0"?>
<tryton>
<data>
<record model="country.country" id="50">
<field name="name">Colombia</field>
<field name="code">CO</field>
<field name="code3">COL</field>
<field name="code_numeric">170</field>
</record>
<record model="country.subdivision" id="CO-91">
<field name="name">Amazonas</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-91</field>
</record>
<record model="country.subdivision" id="CO-05">
<field name="name">Antioquia</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-05</field>
</record>
<record model="country.subdivision" id="CO-81">
<field name="name">Arauca</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-81</field>
</record>
<record model="country.subdivision" id="CO-08">
<field name="name">Atlántico</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-08</field>
</record>
<record model="country.subdivision" id="CO-13">
<field name="name">Bolívar</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-13</field>
</record>
<record model="country.subdivision" id="CO-15">
<field name="name">Boyacá</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-15</field>
</record>
<record model="country.subdivision" id="CO-17">
<field name="name">Caldas</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-17</field>
</record>
<record model="country.subdivision" id="CO-18">
<field name="name">Caquetá</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-18</field>
</record>
<record model="country.subdivision" id="CO-85">
<field name="name">Casanare</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-85</field>
</record>
<record model="country.subdivision" id="CO-19">
<field name="name">Cauca</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-19</field>
</record>
<record model="country.subdivision" id="CO-20">
<field name="name">Cesar</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-20</field>
</record>
<record model="country.subdivision" id="CO-27">
<field name="name">Chocó</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-27</field>
</record>
<record model="country.subdivision" id="CO-23">
<field name="name">Córdoba</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-23</field>
</record>
<record model="country.subdivision" id="CO-25">
<field name="name">Cundinamarca</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-25</field>
</record>
<record model="country.subdivision" id="CO-11">
<field name="name">Bogotá</field>
<field name="type">capital district</field>
<field name="country" ref="50"/>
<field name="code">CO-11</field>
</record>
<record model="country.subdivision" id="CO-94">
<field name="name">Guainía</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-94</field>
</record>
<record model="country.subdivision" id="CO-95">
<field name="name">Guaviare</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-95</field>
</record>
<record model="country.subdivision" id="CO-41">
<field name="name">Huila</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-41</field>
</record>
<record model="country.subdivision" id="CO-44">
<field name="name">La Guajira</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-44</field>
</record>
<record model="country.subdivision" id="CO-47">
<field name="name">Magdalena</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-47</field>
</record>
<record model="country.subdivision" id="CO-50">
<field name="name">Meta</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-50</field>
</record>
<record model="country.subdivision" id="CO-52">
<field name="name">Nariño</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-52</field>
</record>
<record model="country.subdivision" id="CO-54">
<field name="name">Norte de Santander</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-54</field>
</record>
<record model="country.subdivision" id="CO-86">
<field name="name">Putumayo</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-86</field>
</record>
<record model="country.subdivision" id="CO-63">
<field name="name">Quindío</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-63</field>
</record>
<record model="country.subdivision" id="CO-66">
<field name="name">Risaralda</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-66</field>
</record>
<record model="country.subdivision" id="CO-88">
<field name="name">San Andrés y Providencia</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-88</field>
</record>
<record model="country.subdivision" id="CO-68">
<field name="name">Santander</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-68</field>
</record>
<record model="country.subdivision" id="CO-70">
<field name="name">Sucre</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-70</field>
</record>
<record model="country.subdivision" id="CO-73">
<field name="name">Tolima</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-73</field>
</record>
<record model="country.subdivision" id="CO-76">
<field name="name">Valle del Cauca</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-76</field>
</record>
<record model="country.subdivision" id="CO-97">
<field name="name">Vaupés</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-97</field>
</record>
<record model="country.subdivision" id="CO-99">
<field name="name">Vichada</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-99</field>
</record>
</data>
</tryton>

View File

@ -0,0 +1,34 @@
Department,HASC,ISO,FIPS,NUTE,DANE,Dane #,Iso-country,Type,Population,Area(km.²),Area(mi.²),Capital
Amazonas,CO.AM,AMA,CO01,20491,91,91,co-91,department,"46,95","109,665","42,342",Leticia
Antioquia,CO.AN,ANT,CO02,20505,05,05,co-5,department,"5,601,507","63,612","24,561",Medellín
Arauca,CO.AR,ARA,CO03,20781,81,81,co-81,department,"153,028","23,818","9,196",Arauca
Atlántico,CO.AT,ATL,CO04,20208,08,08,co-8,department,"2,112,001","3,388","1,308",Barranquilla
Bolívar,CO.BL,BOL,CO35,20213,13,13,co-13,department,"1,836,640","25,978","10,03",Cartagena
Boyacá,CO.BY,BOY,CO36,20615,15,15,co-15,department,"1,210,982","23,189","8,953",Tunja
Caldas,CO.CL,CAL,CO37,20617,17,17,co-17,department,"898,49","7,888","3,046",Manizales
Caquetá,CO.CQ,CAQ,CO08,20418,18,18,co-18,department,"337,932","88,965","34,35",Florencia
Casanare,CO.CS,CAS,CO32,20785,85,85,co-85,department,"281,294","44,64","17,236",Yopal
Cauca,CO.CA,CAU,CO09,20319,19,19,co-19,department,"1,182,022","29,308","11,316",Popayán
Cesar,CO.CE,CES,CO10,20220,20,20,co-20,department,"878,437","22,905","8,844",Valledupar
Chocó,CO.CH,CHO,CO11,20327,27,27,co-27,department,"388,476","46,53","17,965",Quibdó
Córdoba,CO.CO,COR,CO12,20223,23,23,co-23,department,"1,462,909","25,02","9,66",Montería
Cundinamarca,CO.CU,CUN,CO33,20625,25,25,co-25,department,"2,228,682","22,478","8,679",Bogotá
Bogotá,CO.DC,DC,CO34,20111,11,11,co-11,capital district,"6,778,691","1,732",669,Bogotá
Guainía,CO.GN,GUA,CO15,20494,94,94,co-94,department,"18,797","72,238","27,891",Puerto Inírida
Guaviare,CO.GV,GUV,CO14,20495,95,95,co-95,department,"56,758","42,327","16,343",San José del Guaviare
Huila,CO.HU,HUI,CO16,20641,41,41,co-41,department,"1,001,476","19,89","7,68",Neiva
La Guajira,CO.LG,LAG,CO17,20244,44,44,co-44,department,"655,943","20,848","8,049",Riohacha
Magdalena,CO.MA,MAG,CO38,20247,47,47,co-47,department,"1,136,819","23,188","8,953",Santa Marta
Meta,CO.ME,MET,CO19,20750,50,50,co-50,department,"713,772","85,635","33,064",Villavicencio
Nariño,CO.NA,NAR,CO20,20352,52,52,co-52,department,"1,498,234","33,268","12,845",Pasto
Norte de Santander,CO.NS,NSA,CO21,20554,54,54,co-54,department,"1,208,336","21,658","8,362",Cúcuta
Putumayo,CO.PU,PUT,CO22,20486,86,86,co-86,department,"237,197","24,885","9,608",Mocoa
Quindío,CO.QD,QUI,CO23,20663,63,63,co-63,department,"518,691","1,845",712,Armenia
Risaralda,CO.RI,RIS,CO24,20666,66,66,co-66,department,"859,666","4,14","1,598",Pereira
San Andrés y Providencia,CO.SA,SAP,CO25,20288,88,88,co-88,department,"59,573",44,17,San Andrés
Santander,CO.ST,SAN,CO26,20568,68,68,co-68,department,"1,913,444","30,537","11,79",Bucaramanga
Sucre,CO.SU,SUC,CO27,20270,70,70,co-70,department,"762,263","10,917","4,215",Sincelejo
Tolima,CO.TO,TOL,CO28,20673,73,73,co-73,department,"1,312,304","23,562","9,097",Ibagué
Valle del Cauca,CO.VC,VAC,CO29,20376,76,76,co-76,department,"4,052,535","22,14","8,548",Cali
Vaupés,CO.VP,VAU,CO30,20497,97,97,co-97,department,"19,943","65,268","25,2",Mitú
Vichada,CO.VD,VID,CO31,20799,99,99,co-99,department,"44,592","100,242","38,704",Puerto Carreño
1 Department HASC ISO FIPS NUTE DANE Dane # Iso-country Type Population Area(km.²) Area(mi.²) Capital
2 Amazonas CO.AM AMA CO01 20491 91 91 co-91 department 46,95 109,665 42,342 Leticia
3 Antioquia CO.AN ANT CO02 20505 05 05 co-5 department 5,601,507 63,612 24,561 Medellín
4 Arauca CO.AR ARA CO03 20781 81 81 co-81 department 153,028 23,818 9,196 Arauca
5 Atlántico CO.AT ATL CO04 20208 08 08 co-8 department 2,112,001 3,388 1,308 Barranquilla
6 Bolívar CO.BL BOL CO35 20213 13 13 co-13 department 1,836,640 25,978 10,03 Cartagena
7 Boyacá CO.BY BOY CO36 20615 15 15 co-15 department 1,210,982 23,189 8,953 Tunja
8 Caldas CO.CL CAL CO37 20617 17 17 co-17 department 898,49 7,888 3,046 Manizales
9 Caquetá CO.CQ CAQ CO08 20418 18 18 co-18 department 337,932 88,965 34,35 Florencia
10 Casanare CO.CS CAS CO32 20785 85 85 co-85 department 281,294 44,64 17,236 Yopal
11 Cauca CO.CA CAU CO09 20319 19 19 co-19 department 1,182,022 29,308 11,316 Popayán
12 Cesar CO.CE CES CO10 20220 20 20 co-20 department 878,437 22,905 8,844 Valledupar
13 Chocó CO.CH CHO CO11 20327 27 27 co-27 department 388,476 46,53 17,965 Quibdó
14 Córdoba CO.CO COR CO12 20223 23 23 co-23 department 1,462,909 25,02 9,66 Montería
15 Cundinamarca CO.CU CUN CO33 20625 25 25 co-25 department 2,228,682 22,478 8,679 Bogotá
16 Bogotá CO.DC DC CO34 20111 11 11 co-11 capital district 6,778,691 1,732 669 Bogotá
17 Guainía CO.GN GUA CO15 20494 94 94 co-94 department 18,797 72,238 27,891 Puerto Inírida
18 Guaviare CO.GV GUV CO14 20495 95 95 co-95 department 56,758 42,327 16,343 San José del Guaviare
19 Huila CO.HU HUI CO16 20641 41 41 co-41 department 1,001,476 19,89 7,68 Neiva
20 La Guajira CO.LG LAG CO17 20244 44 44 co-44 department 655,943 20,848 8,049 Riohacha
21 Magdalena CO.MA MAG CO38 20247 47 47 co-47 department 1,136,819 23,188 8,953 Santa Marta
22 Meta CO.ME MET CO19 20750 50 50 co-50 department 713,772 85,635 33,064 Villavicencio
23 Nariño CO.NA NAR CO20 20352 52 52 co-52 department 1,498,234 33,268 12,845 Pasto
24 Norte de Santander CO.NS NSA CO21 20554 54 54 co-54 department 1,208,336 21,658 8,362 Cúcuta
25 Putumayo CO.PU PUT CO22 20486 86 86 co-86 department 237,197 24,885 9,608 Mocoa
26 Quindío CO.QD QUI CO23 20663 63 63 co-63 department 518,691 1,845 712 Armenia
27 Risaralda CO.RI RIS CO24 20666 66 66 co-66 department 859,666 4,14 1,598 Pereira
28 San Andrés y Providencia CO.SA SAP CO25 20288 88 88 co-88 department 59,573 44 17 San Andrés
29 Santander CO.ST SAN CO26 20568 68 68 co-68 department 1,913,444 30,537 11,79 Bucaramanga
30 Sucre CO.SU SUC CO27 20270 70 70 co-70 department 762,263 10,917 4,215 Sincelejo
31 Tolima CO.TO TOL CO28 20673 73 73 co-73 department 1,312,304 23,562 9,097 Ibagué
32 Valle del Cauca CO.VC VAC CO29 20376 76 76 co-76 department 4,052,535 22,14 8,548 Cali
33 Vaupés CO.VP VAU CO30 20497 97 97 co-97 department 19,943 65,268 25,2 Mitú
34 Vichada CO.VD VID CO31 20799 99 99 co-99 department 44,592 100,242 38,704 Puerto Carreño

View File

@ -0,0 +1,209 @@
<?xml version="1.0"?>
<tryton>
<data>
<record model="country.country" id="50">
<field name="name">Colombia</field>
<field name="code">CO</field>
<field name="code3">COL</field>
<field name="code_numeric">170</field>
</record>
<record model="country.subdivision" id="CO-91">
<field name="name">Amazonas</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-91</field>
</record>
<record model="country.subdivision" id="CO-05">
<field name="name">Antioquia</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-05</field>
</record>
<record model="country.subdivision" id="CO-81">
<field name="name">Arauca</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-81</field>
</record>
<record model="country.subdivision" id="CO-08">
<field name="name">Atlántico</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-08</field>
</record>
<record model="country.subdivision" id="CO-13">
<field name="name">Bolívar</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-13</field>
</record>
<record model="country.subdivision" id="CO-15">
<field name="name">Boyacá</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-15</field>
</record>
<record model="country.subdivision" id="CO-17">
<field name="name">Caldas</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-17</field>
</record>
<record model="country.subdivision" id="CO-18">
<field name="name">Caquetá</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-18</field>
</record>
<record model="country.subdivision" id="CO-85">
<field name="name">Casanare</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-85</field>
</record>
<record model="country.subdivision" id="CO-19">
<field name="name">Cauca</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-19</field>
</record>
<record model="country.subdivision" id="CO-20">
<field name="name">Cesar</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-20</field>
</record>
<record model="country.subdivision" id="CO-27">
<field name="name">Chocó</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-27</field>
</record>
<record model="country.subdivision" id="CO-23">
<field name="name">Córdoba</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-23</field>
</record>
<record model="country.subdivision" id="CO-25">
<field name="name">Cundinamarca</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-25</field>
</record>
<record model="country.subdivision" id="CO-11">
<field name="name">Bogotá</field>
<field name="type">capital district</field>
<field name="country" ref="50"/>
<field name="code">CO-11</field>
</record>
<record model="country.subdivision" id="CO-94">
<field name="name">Guainía</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-94</field>
</record>
<record model="country.subdivision" id="CO-95">
<field name="name">Guaviare</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-95</field>
</record>
<record model="country.subdivision" id="CO-41">
<field name="name">Huila</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-41</field>
</record>
<record model="country.subdivision" id="CO-44">
<field name="name">La Guajira</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-44</field>
</record>
<record model="country.subdivision" id="CO-47">
<field name="name">Magdalena</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-47</field>
</record>
<record model="country.subdivision" id="CO-50">
<field name="name">Meta</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-50</field>
</record>
<record model="country.subdivision" id="CO-52">
<field name="name">Nariño</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-52</field>
</record>
<record model="country.subdivision" id="CO-54">
<field name="name">Norte de Santander</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-54</field>
</record>
<record model="country.subdivision" id="CO-86">
<field name="name">Putumayo</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-86</field>
</record>
<record model="country.subdivision" id="CO-63">
<field name="name">Quindío</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-63</field>
</record>
<record model="country.subdivision" id="CO-66">
<field name="name">Risaralda</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-66</field>
</record>
<record model="country.subdivision" id="CO-88">
<field name="name">San Andrés y Providencia</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-88</field>
</record>
<record model="country.subdivision" id="CO-68">
<field name="name">Santander</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-68</field>
</record>
<record model="country.subdivision" id="CO-70">
<field name="name">Sucre</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-70</field>
</record>
<record model="country.subdivision" id="CO-73">
<field name="name">Tolima</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-73</field>
</record>
<record model="country.subdivision" id="CO-76">
<field name="name">Valle del Cauca</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-76</field>
</record>
<record model="country.subdivision" id="CO-97">
<field name="name">Vaupés</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-97</field>
</record>
<record model="country.subdivision" id="CO-99">
<field name="name">Vichada</field>
<field name="type">department</field>
<field name="country" ref="50"/>
<field name="code">CO-99</field>
</record>
</data>
</tryton>

View File

@ -0,0 +1,53 @@
"""
Convierte el archivo departamentos_colombia.csv
en subdivision_colombia.xml
"""
import csv
model = 'country.subdivision'
departamentos = open('departamentos_colombia.csv','r')
departamentos_xml = open('departamentos_colombia.xml','w')
departamentos_reader = csv.reader(departamentos)
departamentos_header = next(departamentos_reader)
d_fields = {departamentos_header[x]:x for x in range(0,len(departamentos_header))}
Departamentos = {}
departamentos_xml.write('''<?xml version="1.0"?>
<tryton>
<data>
''')
departamentos_xml.write(''' <record model="country.country" id="50">
<field name="name">Colombia</field>
<field name="code">CO</field>
<field name="code3">COL</field>
<field name="code_numeric">170</field>
</record>
''')
for row in departamentos_reader:
dane_code = row[d_fields['DANE']]
country_id = "50"
departamentos_xml.write(''' <record model="{model}" id="{id}">
<field name="name">{name}</field>
<field name="type">{types}</field>
<field name="country" ref="50"/>
<field name="code">{code}</field>
</record>
'''.format(
model=model,
id="CO-"+str(dane_code),
name=row[d_fields['Department']],
types = row[d_fields['Type']],
code="CO-"+str(dane_code),
dane_code=dane_code
))
departamentos_xml.write(""" </data>
</tryton>
"""
)
departamentos.close()
departamentos_xml.close()

1115
doc/municipios_colombia.csv Normal file

File diff suppressed because it is too large Load Diff

6690
doc/municipios_colombia.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,56 @@
"""
Convierte el archivo municipios_colombia.csv y departamentos_colombia.csv
en municipios_colombia.xml
"""
import csv
model = 'country.city'
municipios = open('municipios_colombia.csv','r')
departamentos = open('departamentos_colombia.csv','r')
municipios_xml = open('municipios_colombia.xml','w')
#departamentos_xml = open('departamentos_colombia.xml','w')
municipios_reader = csv.reader(municipios)
departamentos_reader = csv.reader(departamentos)
departamentos_header = next(departamentos_reader)
d_fields = {departamentos_header[x]:x for x in range(0,len(departamentos_header))}
Departamentos = {}
for departamento in departamentos_reader:
#iso_id = 'co-' + str(departamento[d_fields['ISO']]).lower
dane_code = int(departamento[d_fields['DANE']])
Departamentos [dane_code] = dict(zip(list(d_fields.keys()),departamento))
departamentos.close()
municipios_header = next(municipios_reader)
m_fields = {municipios_header[x]:x for x in range(0,len(municipios_header))}
municipios_xml.write("""<?xml version="1.0"?>
<tryton>
<data>
""")
for row in municipios_reader:
dane_code = row[m_fields['department']] + row[m_fields['code']]
depto_id = "CO-" + Departamentos[int(row[m_fields['department']])]['DANE']
municipios_xml.write(""" <record model="{model}" id="{id}">
<field name="name">{name}</field>
<field name="dane_code">{dane_code}</field>
<field name="subdivision" ref="{depto_id}"/>
<field name="code">{code}</field>
</record>
""".format(
model=model,
id="CO-"+str(dane_code),
name=row[m_fields['name']],
code="CO-"+str(dane_code),
dane_code=dane_code,
depto_id=depto_id,
))
municipios_xml.write("""
</data>
</tryton>
"""
)
municipios.close()
municipios_xml.close()

6690
municipios_colombia.xml Normal file

File diff suppressed because it is too large Load Diff

308
party.py Normal file
View File

@ -0,0 +1,308 @@
from trytond.model import fields, ModelSQL, ModelView, Unique, sequence_ordered
from trytond.pool import PoolMeta, Pool
from trytond.pyson import Eval, Not, Equal
import logging
from trytond.exceptions import UserError
logger = logging.getLogger(__name__)
__all__ = ['PartyIdentifier','Party','ContactMechanism','Address']
CO_IDENTIFIERS = [
(None, ''),
('11', 'Registro Civil'),
('12', 'Tarjeta de Identidad'),
('13', 'Cedula de Ciudadania'),
('21', 'Tarjeta de Extranjeria'),
('22', 'Cedula de Extranjeria'),
('31', 'NIT'),
('41', 'Pasaporte'),
('42', 'Tipo de Documento Extrangero'),
('43', 'Documento de identificación extranjero'),
('50', 'NIT de otro país'),
('91', 'NUIP')
]
CO_CONTACT_MECHANISM_TYPES = [
('sms','SMS')
]
class Party(ModelSQL,ModelView):
"Party Colombian"
__name__='party.party'
__metaclass__ = PoolMeta
first_name = fields.Char("Primer Nombre",states={
'invisible': Not(Eval('type_person') == 'persona_natural'),}
)
second_name = fields.Char("Segundo Nombre",states={
'invisible': Not(Eval('type_person') == 'persona_natural'),}
)
first_surname = fields.Char("Primer Apellido",states={
'invisible': Not(Eval('type_person') == 'persona_natural'),}
)
second_surname = fields.Char("Segundo Apellido",states={
'invisible': Not(Eval('type_person') == 'persona_natural'),},
depends=['type_person'])
birth_date = fields.Date('Fecha de nacimiento')
regime_tax = fields.Selection([
(None, ''),
('regimen_simplificado', 'Regimen Simplificado'),
('regimen_comun', 'Regimen Comun'),
('gran_contribuyente', 'Gran Contribuyente'),
('entidad_estatal', 'Entidad Estatal'),
('domiciliado_extranjero', 'Domiciliado en Extranjero'),
], 'Regimen de Impuestos')
type_person = fields.Selection([
(None, ''),
('persona_natural', 'Persona Natural'),
('persona_juridica', 'Persona Juridica'),
], 'Tipo de Persona')
self_withholding = fields.Boolean('Self Withholding')
declarant = fields.Boolean('Declarant')
main_ciiu_code = fields.Char('Main CIIU Code', size=4)
secondary_ciiu_code = fields.Char('Secondary CIIU Code', size=4)
other_ciiu_code = fields.Char('Other CIIU Code', size=4)
age = fields.Function(fields.Integer('Edad'),'on_change_with_age')
type_tax_identifier = fields.Function(fields.Selection('get_types_identifier','Tipo de Identidad'),'on_change_with_type_tax_identifier')
@staticmethod
def default_type_person():
return 'persona_natural'
@classmethod
def tax_identifier_types(cls):
#return ['11', '12', '13', '21', '22', '31', '41', '42', '43', '50', '91']
return ['31']
@fields.depends('birth_date')
def on_change_with_age(self,name=None):
if self.birth_date:
Date = Pool().get('ir.date')
today = Date.today()
age = today.year - self.birth_date.year
age -= (today.month, today.day) < (self.birth_date.month, self.birth_date.day)
return age
@fields.depends('name','first_name','second_name','first_surname',
'second_surname','type_person')
def on_change_type_person(self):
if self.type_person == 'persona_natural':
self.on_change_name()
if self.type_person == 'persona_juridica':
pass
@fields.depends('name','first_name','second_name','first_surname',
'second_surname','type_person')
def on_change_name(self):
self.rebuild_name()
@fields.depends('name','first_name','second_name','first_surname',
'second_surname','type_person')
def on_change_first_name(self):
self.rebuild_name()
@fields.depends('name','first_name','second_name','first_surname',
'second_surname','type_person')
def on_change_second_name(self):
self.rebuild_name()
@fields.depends('name','first_name','second_name','first_surname',
'second_surname','type_person')
def on_change_second_surname(self):
self.rebuild_name()
@fields.depends('name','first_name','second_name','first_surname',
'second_surname','type_person')
def on_change_first_surname(self):
self.rebuild_name()
def rebuild_name(self):
"""reconstruye los campos relacionados con el nombre dependiendo de
estos y del tipo de persona."""
if self.type_person == 'persona_natural':
if not (self.first_name or self.second_name \
or self.first_surname or self.second_surname):
if self.name:
self.first_name, self.second_name, self.first_surname, \
self.second_surname = self.split_name(self.name)
else:
return
else:
self.name = self.get_full_name()
if self.type_person == 'persona_juridica':
if self.name:
self.clean_split_name()
else:
self.name = self.get_full_name()
def clean_split_name(self):
self.first_name = self.second_name = self.first_surname = self.second_surname = ''
@staticmethod
def split_name(name):
"""Divide un nombre completo en una lista de 4 elementos"""
second_surname = None
first_surname = None
second_name = None
first_name = None
names = name.split(' ')
if len(names) > 0:
first_name = names[0]
if len(names) == 2:
second_surname = None
first_surname = names[1]
elif len(names) == 3:
first_surname = names[1]
second_surname = names[2]
elif len(names) >= 4:
second_name = names[1]
first_surname = names[2]
second_surname = " ".join(names[3:])
return [first_name,second_name,first_surname, second_surname]
@fields.depends('identifiers')
def on_change_with_type_tax_identifier(self,name=None):
types = self._tax_identifier_types()
if self.identifiers:
for identifier in self.identifiers:
if identifier.type in types:
return identifier.type
@fields.depends('identifiers')
def on_change_with_tax_identifier(self,name=None):
if self.identifiers:
return self.get_tax_identifier(name)
@classmethod
def _tax_identifier_types(cls):
types = super(Party, cls).tax_identifier_types()
types.extend(['31','13'])
return types
def get_full_name(self, name=None):
if self.type_person == 'persona_natural':
name_list = [self.first_name, self.second_name,
self.first_surname,self.second_surname]
return " ".join([x for x in name_list if x])
return self.name
@staticmethod
def get_types_identifier():
PartyIdentifier = Pool().get('party.identifier')
return PartyIdentifier.type.selection
def pre_validate(self):
super(Party, self).pre_validate()
if not self.identifiers:
self.raise_user_error("El tercero debe tener un documento de identidad")
class PartyIdentifier(ModelSQL, ModelView):
"Party Identifier Colombian"
__name__ = "party.identifier"
__metaclass__ = PoolMeta
expedition_city = fields.Many2One("country.subdivision",
'Ciudad de Expedicion',
help="Lugar donde fue expedido el documento de identidad",
domain=[('parent', '!=', None)],
states = {'invisible':Not(Equal(Eval('type'),'13'))}
)
rut = fields.Boolean('Rut')
check_digit = fields.Function(fields.Integer('DV',
help='Digito de Verificacion colombiano',
states = {'invisible':Not(Equal(Eval('type'),'31'))})
,'on_change_with_check_digit')
@classmethod
def __setup__(cls):
super(PartyIdentifier, cls).__setup__()
cls.type.selection = CO_IDENTIFIERS
table = cls.__table__()
cls._sql_constraints += [
('UniqueIdentifier', Unique(table, table.code,table.type),
'La identificacion ya existe')
]
@fields.depends('type','code')
def on_change_with_check_digit(self,name=None):
try:
import stdnum.co.nit #la version debe ser mayor a la 1.2 o 1.3
except:
self.raise_user_error('Se requiere modulo stdnum.co.nit')
if self.type and self.code:
if self.type in ('31'):
return int(stdnum.co.nit.calc_check_digit(self.code))
@fields.depends('type', 'party', 'code')
def check_code(self):
super(PartyIdentifier, self).check_code()
if self.type == '31':
#generalizar multiples paises
#puede ser por el country del party de la company actual
try:
import stdnum.co.nit #la version debe ser mayor a la 1.2 o 1.3
except:
self.raise_user_error('Se requiere modulo stdnum.co.nit')
if not stdnum.co.nit.is_valid(self.code + str(self.check_digit)):
if self.party and self.party.id > 0:
party = self.party.rec_name
else:
party = ''
self.raise_user_error('invalid_vat', {
'code': self.code,
'party': party,
})
if self.type in ['12','13','31'] and not self.code.isdigit():
if self.party and self.party.id > 0:
party = self.party.rec_name
else:
party = ''
self.raise_user_error('invalid_vat',{
'code':self.code,
'party':party
})
@staticmethod
def default_type_document():
return '13'
def get_rec_name(self,name=None):
if self.code:
return self.code
elif self.id:
return self.id
return ''
class ContactMechanism(sequence_ordered(), ModelSQL, ModelView):
"Contact Mechanism"
__name__ = 'party.contact_mechanism'
__metaclass__ = PoolMeta
@classmethod
def __setup__(cls):
super(ContactMechanism, cls).__setup__()
cls.type.selection.extend(CO_CONTACT_MECHANISM_TYPES)
class Address(ModelSQL, ModelView):
"Address"
__metaclass__ = PoolMeta
__name__ = 'party.address'
citys = fields.Many2One("country.city",
'City',
domain=[
('subdivision', '=', Eval('subdivision', 0))],
depends=['subdivision']
)

29
party.xml Normal file
View File

@ -0,0 +1,29 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<!-- Inicio Party -->
<record model="ir.ui.view" id="party_view_form">
<field name="model">party.party</field>
<field name="inherit" ref="party.party_view_form"/>
<field name="name">party_form</field>
</record>
<record model="ir.ui.view" id="party_view_tree">
<field name="model">party.party</field>
<field name="inherit" ref="party.party_view_tree"/>
<field name="name">party_tree</field>
</record>
<!-- Fin Party -->
<!-- Inicio Identification -->
<record model="ir.ui.view" id="identifier_view_form">
<field name="model">party.identifier</field>
<field name="inherit" ref="party.identifier_form"/>
<field name="name">identifier_form</field>
</record>
<record model="ir.ui.view" id="identifier_view_tree">
<field name="model">party.identifier</field>
<field name="inherit" ref="party.identifier_list"/>
<field name="name">identifier_tree</field>
</record>
<!-- Fin Identification -->
</tryton>

View File

@ -2,4 +2,9 @@
version=5.4
depends:
ir
party
xml:
party.xml
address.xml
departamentos_colombia.xml
municipios_colombia.xml

9
view/address_form.xml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<data>
<xpath expr="//label[@name='city']" position="replace"></xpath>
<xpath expr="//field[@name='city']" position="replace"></xpath>
<xpath expr="//field[@name='subdivision']" position="after">
<label name="citys"/>
<field name="citys" widget="selection"/>
</xpath>
</data>

13
view/identifier_form.xml Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<data>
<xpath
expr="/form/field[@name='code']"
position="after">
<label name="expedition_city"/>
<field name="expedition_city"/>
<label name="check_digit"/>
<field name="check_digit"/>
<label name="rut"/>
<field name="rut"/>
</xpath>
</data>

9
view/identifier_tree.xml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<data>
<xpath
expr="/tree/field[@name='code']"
position="after">
<field name="expedition_city"/>
<field name="check_digit"/>
</xpath>
</data>

51
view/party_form.xml Normal file
View File

@ -0,0 +1,51 @@
<?xml version="1.0"?>
<data>
<xpath
expr="/form/group[@id='checkboxes']"
position="after">
<label name="first_name"/>
<field name="first_name"/>
<label name="second_name"/>
<field name="second_name"/>
<label name="first_surname"/>
<field name="first_surname"/>
<label name="second_surname"/>
<field name="second_surname"/>
<label name="type_tax_identifier"/>
<field name="type_tax_identifier"/>
<label name="tax_identifier"/>
<field name="tax_identifier"/>
<label name="type_person"/>
<field name="type_person"/>
<label name="birth_date"/>
<field name="birth_date"/>
<label name="age"/>
<field name="age"/>
<label name="age"/>
<field name="age"/>
</xpath>
<xpath
expr="/form/notebook/page[@name='identifiers']"
position="after">
<page string="Colombia" id="party_co">
<label name="regime_tax"/>
<field name="regime_tax"/>
<label name="self_withholding"/>
<field name="self_withholding"/>
<label name="declarant"/>
<field name="declarant"/>
<label name="main_ciiu_code"/>
<field name="main_ciiu_code"/>
<label name="secondary_ciiu_code"/>
<field name="secondary_ciiu_code"/>
<label name="other_ciiu_code"/>
<field name="other_ciiu_code"/>
</page>
</xpath>
</data>

17
view/party_tree.xml Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<data>
<xpath
expr="/tree/field[@name='name']"
position="after">
<field name="first_name"/>
<field name="second_name"/>
<field name="first_surname"/>
<field name="second_surname"/>
<field name="age"/>
</xpath>
<xpath
expr="/tree/field[@name='tax_identifier']"
position="before">
<field name="type_tax_identifier"/>
</xpath>
</data>