1 | # coding=utf-8 |
---|
2 | """ |
---|
3 | Simulador Integral de Cadenas Productivas (SICP) |
---|
4 | |
---|
5 | Copyleft (@) 2015 CENDITEL nodo Mérida - https://miv.cenditel.gob.ve/simulacion/ |
---|
6 | """ |
---|
7 | ## @package apps.simulacion.matrizip.views |
---|
8 | # |
---|
9 | # Clases y funciones a implementar en las vistas del módulo de consulta de la matriz insumo / producto |
---|
10 | # @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) |
---|
11 | # @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres |
---|
12 | # (CENDITEL) nodo Mérida - Venezuela</a> |
---|
13 | # @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
14 | # @date 07-10-2015 |
---|
15 | # @version 3.0.0 |
---|
16 | |
---|
17 | ## Muestra el autor del script cuando es invocado |
---|
18 | __author__ = "Ing. Roldan Vargas (rvargas at cenditel.gob.ve)" |
---|
19 | ## Muestra documentación breve sobre el script |
---|
20 | __doc__ = "Clases y funciones a implementar en las vistas del módulo de consulta de la matriz insumo / producto" |
---|
21 | |
---|
22 | from django.template.context import RequestContext |
---|
23 | from django.http import HttpResponse |
---|
24 | from django.shortcuts import render_to_response |
---|
25 | from django.conf import settings |
---|
26 | from django.utils.translation import ugettext_lazy as _ |
---|
27 | from django.db.models import Sum |
---|
28 | from django.db.models.loading import get_model |
---|
29 | from apps.comun.functions import render_cadena |
---|
30 | from apps.comun.models import CodigoAran |
---|
31 | from apps.comun.constantes import MSG_NOT_AJAX |
---|
32 | from apps.simulacion.models import ConvertirActividadACIIU, ConvertirCodigoArancelario |
---|
33 | from apps.simulacion.sigesic.models import UnidadEconomica, Producto |
---|
34 | from apps.simulacion.matrizip.models import ProduccionMIP, UtilizacionMIP, ActividadesImportacion, \ |
---|
35 | Productos as ProductosMIP |
---|
36 | import os |
---|
37 | import json |
---|
38 | import logging |
---|
39 | |
---|
40 | logger = logging.getLogger("matrizip") |
---|
41 | |
---|
42 | def graficar_matriz(request): |
---|
43 | """! |
---|
44 | Función que ejecuta la instrucción necesaria para mostrar el correspondiente gráfico de la Matriz Insumo/Producto |
---|
45 | asociada al escenario en estudio |
---|
46 | |
---|
47 | @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) |
---|
48 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
49 | @date 19-10-2015 |
---|
50 | @param request <b>{object}</b> Objeto que contiene la petición |
---|
51 | @return Devuelve el correspondiente gráfico de la matriz insumo/producto a mostrar |
---|
52 | """ |
---|
53 | rif = request.GET['rif'] |
---|
54 | id_prod = request.GET['id_prod'] |
---|
55 | ahora = request.GET.get('ahora') |
---|
56 | |
---|
57 | existe, cod_act = None, None |
---|
58 | |
---|
59 | pr = Producto.objects.using('sigesic').get(pk=id_prod) |
---|
60 | |
---|
61 | try: |
---|
62 | cod_aran = CodigoAran.objects.get(pk=pr.codigo_aran_id) |
---|
63 | ca = ConvertirCodigoArancelario.objects.filter(codigo=cod_aran) |
---|
64 | |
---|
65 | if ca: |
---|
66 | cod_pr = ca[0].codigo_producto |
---|
67 | if cod_pr.__len__() == 1: |
---|
68 | cod_pr = "00%s" % cod_pr |
---|
69 | elif cod_pr.__len__() == 2: |
---|
70 | cod_pr = "0%s" % cod_pr |
---|
71 | |
---|
72 | if ProduccionMIP.objects.using('matrizip_1997').filter(codigo_producto=cod_pr): |
---|
73 | existe = True |
---|
74 | |
---|
75 | if existe: |
---|
76 | salida = os.path.join(settings.BASE_DIR, "tmp/%s_%s.svg" % (str(request.user),ahora)) |
---|
77 | |
---|
78 | narriba = '2' |
---|
79 | nabajo = '2' |
---|
80 | os.system("cd " + os.path.join(settings.BASE_DIR, "tmp/")) |
---|
81 | os.system( |
---|
82 | os.path.join(settings.BASE_DIR, "apis/chains/print_prod_chain_act") + |
---|
83 | " --host=" + settings.DATABASES['matrizip_1997']['HOST'] + |
---|
84 | " --port=" + settings.DATABASES['matrizip_1997']['PORT'] + |
---|
85 | " --username=" + settings.DATABASES['matrizip_1997']['USER'] + |
---|
86 | " --password=" +settings.DATABASES['matrizip_1997']['PASSWORD'] + |
---|
87 | " --dbname=" + settings.DATABASES['matrizip_1997']['NAME'] + |
---|
88 | " --levelsup=" + narriba + " --levelsdown=" + nabajo + |
---|
89 | " --output=" + str(request.user) + "_" + ahora + " PROD " + cod_pr |
---|
90 | ) |
---|
91 | archivo = str(request.user) + "_" + ahora + ".svg " |
---|
92 | os.system( |
---|
93 | "mv -f " + os.path.join(settings.BASE_DIR, archivo) + os.path.join(settings.BASE_DIR, "tmp/")+";"+ |
---|
94 | "chmod -R 755 "+ os.path.join(settings.BASE_DIR, "tmp/") |
---|
95 | ) |
---|
96 | |
---|
97 | cadena = render_cadena(str(request.user)) |
---|
98 | |
---|
99 | logger.info( |
---|
100 | u"Se ha generado un nuevo archivo con el gráfico de la matriz insumo / producto solicitada por el " |
---|
101 | u"usuario %s del producto %s" % (str(request.user), cod_pr) |
---|
102 | ) |
---|
103 | except Exception, e: |
---|
104 | logger.error( |
---|
105 | u"Ocurrió un error al generar el archivo de imagen de la matriz insumo / producto solicitada por el " |
---|
106 | u"usuario %s del producto %s. Detalles: %s" % (str(request.user), id_prod, str(e)) |
---|
107 | ) |
---|
108 | |
---|
109 | return render_to_response("grafico.html", { |
---|
110 | "username":request.user, "existe":existe,"rif":rif,'ahora':ahora, 'matriz':True, 'prod':pr |
---|
111 | }, context_instance=RequestContext(request)) |
---|
112 | |
---|
113 | |
---|
114 | def datos_produccion(request): |
---|
115 | """! |
---|
116 | Función que ejecuta la instrucción necesaria para mostrar datos de producción, utilización e importación de la |
---|
117 | Matriz Insumo / Producto asociada al escenario en estudio |
---|
118 | |
---|
119 | @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) |
---|
120 | @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> |
---|
121 | @date 27-10-2015 |
---|
122 | @param request <b>{object}</b> Objeto que contiene la petición |
---|
123 | @return Devuelve un JSON con los datos de la Matriz Insumo / Producto |
---|
124 | """ |
---|
125 | try: |
---|
126 | if not request.is_ajax(): |
---|
127 | return HttpResponse(json.dumps({'resultado': False, 'error': MSG_NOT_AJAX})) |
---|
128 | |
---|
129 | id_prod = request.GET.get('id_prod', None) |
---|
130 | rif = request.GET.get('rif', None) |
---|
131 | |
---|
132 | if not id_prod or not rif: |
---|
133 | return HttpResponse(json.dumps({ |
---|
134 | 'resultado': False, 'error': _(u"No existe datos de producción en la matriz insumo / producto.") |
---|
135 | })) |
---|
136 | |
---|
137 | datos = { |
---|
138 | 'produccion': [], |
---|
139 | 'utilizacion': [], |
---|
140 | 'importacion': [] |
---|
141 | } |
---|
142 | |
---|
143 | ue = UnidadEconomica.objects.using('sigesic').get(rif=rif) |
---|
144 | ae_ciiu = ue.actividadciiu_set.get(activo=True, principal=True) |
---|
145 | actividad = {'codigo': ae_ciiu.ciiu_id, 'descripcion': ae_ciiu.ciiu.descripcion} |
---|
146 | pr = Producto.objects.using('sigesic').get(pk=id_prod) |
---|
147 | cod_aran = CodigoAran.objects.get(pk=pr.codigo_aran_id) |
---|
148 | ca = ConvertirCodigoArancelario.objects.get(codigo=cod_aran) |
---|
149 | |
---|
150 | produccion_total, utilizacion_total, importacion_total = 0, 0, 0 |
---|
151 | |
---|
152 | if ca: |
---|
153 | cod_pr = ca.codigo_producto |
---|
154 | for prdlen in range(1,3): |
---|
155 | if cod_pr.__len__() <= prdlen: |
---|
156 | cod_pr = "0%s" % cod_pr |
---|
157 | |
---|
158 | |
---|
159 | actividades = lambda x, y: [ |
---|
160 | p_mip.codigo_actividad_id |
---|
161 | for p_mip in get_model('matrizip', y).objects.using('matrizip_1997').filter(codigo_producto=x) |
---|
162 | ] |
---|
163 | productos = lambda x, y: [ |
---|
164 | p.codigo_producto_id |
---|
165 | for p in get_model('matrizip', y).objects.using('matrizip_1997').filter(codigo_actividad__in=x).distinct('codigo_producto') |
---|
166 | ] |
---|
167 | produccion_total = ProduccionMIP.objects.using('matrizip_1997').filter(codigo_producto__in=productos(actividades(cod_pr,'ProduccionMIP'),'ProduccionMIP')).aggregate(total_produccion=Sum('prod_mill_bs')) |
---|
168 | for prdmip in ProduccionMIP.objects.using('matrizip_1997').filter(codigo_producto__in=productos(actividades(cod_pr,'ProduccionMIP'),'ProduccionMIP')).distinct('codigo_producto'): |
---|
169 | for p in ProduccionMIP.objects.using('matrizip_1997').filter(codigo_producto=prdmip.codigo_producto_id).values('codigo_producto').annotate(total_produccion=Sum('prod_mill_bs')): |
---|
170 | datos['produccion'].append( |
---|
171 | { |
---|
172 | 'total_produccion': str(p['total_produccion']), |
---|
173 | 'codigo_producto': str(p['codigo_producto']), |
---|
174 | 'descripcion': ProductosMIP.objects.using('matrizip_1997').get(codigo_producto=p['codigo_producto']).descripcion, |
---|
175 | 'porcentaje': str(round((p['total_produccion'] * 100) / produccion_total['total_produccion'], 2)) |
---|
176 | } |
---|
177 | ) |
---|
178 | |
---|
179 | utilizacion_total = UtilizacionMIP.objects.using('matrizip_1997').filter(codigo_producto__in=productos(actividades(cod_pr,'UtilizacionMIP'),'UtilizacionMIP')).aggregate(total_utilizacion=Sum('util_mill_bs')) |
---|
180 | for utlmip in UtilizacionMIP.objects.using('matrizip_1997').filter(codigo_producto__in=productos(actividades(cod_pr,'UtilizacionMIP'),'UtilizacionMIP')).distinct('codigo_producto'): |
---|
181 | for u in UtilizacionMIP.objects.using('matrizip_1997').filter(codigo_producto=utlmip.codigo_producto_id).values('codigo_producto').annotate(total_utilizacion=Sum('util_mill_bs')): |
---|
182 | datos['utilizacion'].append( |
---|
183 | { |
---|
184 | 'total_utilizacion': str(u['total_utilizacion']), |
---|
185 | 'codigo_producto': str(u['codigo_producto']), |
---|
186 | 'descripcion': ProductosMIP.objects.using('matrizip_1997').get(codigo_producto=u['codigo_producto']).descripcion, |
---|
187 | 'porcentaje': str(round((u['total_utilizacion'] * 100) / utilizacion_total['total_utilizacion'], 2)) |
---|
188 | } |
---|
189 | ) |
---|
190 | |
---|
191 | importacion_total = ActividadesImportacion.objects.using('matrizip_1997').filter(codigo_producto__in=productos(actividades(cod_pr,'ActividadesImportacion'),'ActividadesImportacion')).aggregate(total_importacion=Sum('monto_mill_bs')) |
---|
192 | for imp in ActividadesImportacion.objects.using('matrizip_1997').filter(codigo_producto__in=productos(actividades(cod_pr,'ActividadesImportacion'),'ActividadesImportacion')).distinct('codigo_producto'): |
---|
193 | for i in ActividadesImportacion.objects.using('matrizip_1997').filter(codigo_producto=imp.codigo_producto_id).values('codigo_producto').annotate(total_importacion=Sum('monto_mill_bs')): |
---|
194 | datos['importacion'].append( |
---|
195 | { |
---|
196 | 'total_importacion': str(i['total_importacion']), |
---|
197 | 'codigo_producto': str(i['codigo_producto']), |
---|
198 | 'descripcion': ProductosMIP.objects.using('matrizip_1997').get(codigo_producto=i['codigo_producto']).descripcion, |
---|
199 | 'porcentaje': str(round((i['total_importacion'] * 100) / importacion_total['total_importacion'], 2)) |
---|
200 | } |
---|
201 | ) |
---|
202 | |
---|
203 | logger.info( |
---|
204 | u"Se han generado con éxito los datos de producción de la matriz insumo / producto solicitados por el " |
---|
205 | u"usuario %s para el producto %s" % (str(request.user), pr.nombre) |
---|
206 | ) |
---|
207 | |
---|
208 | return HttpResponse(json.dumps({ |
---|
209 | 'resultado': True, 'ae_ciiu': actividad, 'produccion': datos['produccion'], |
---|
210 | 'produccion_total': str(produccion_total['total_produccion']), |
---|
211 | 'utilizacion': datos['utilizacion'], 'utilizacion_total': str(utilizacion_total['total_utilizacion']), |
---|
212 | 'importacion': datos['importacion'], 'importacion_total': str(importacion_total['total_importacion']) |
---|
213 | })) |
---|
214 | |
---|
215 | except Exception, e: |
---|
216 | logger.error( |
---|
217 | u"Ocurrió un error al procesar la solicitud del usuario %s para los datos de producción de la " |
---|
218 | u"matriz insumo / producto. Detalles: %s" % (str(request.user), str(e)) |
---|
219 | ) |
---|
220 | return HttpResponse(json.dumps({'resultado': False, 'error': e})) |
---|