source: sicp/apps/simulacion/matrizip/views.py @ 05eedbc

Last change on this file since 05eedbc was 05eedbc, checked in by Ing. Roldan D. Vargas G <rvargas@…>, 8 years ago

se agregan instrucciones de log

  • Property mode set to 100644
File size: 11.5 KB
Line 
1# coding=utf-8
2"""
3Simulador Integral de Cadenas Productivas (SICP)
4
5Copyleft (@) 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
22from django.template.context import RequestContext
23from django.http import HttpResponse
24from django.shortcuts import render_to_response
25from django.conf import settings
26from django.utils.translation import ugettext_lazy as _
27from django.db.models import Sum
28from django.db.models.loading import get_model
29from apps.comun.functions import render_cadena
30from apps.comun.models import CodigoAran
31from apps.comun.constantes import MSG_NOT_AJAX
32from apps.simulacion.models import ConvertirActividadACIIU, ConvertirCodigoArancelario
33from apps.simulacion.sigesic.models import UnidadEconomica, Producto
34from apps.simulacion.matrizip.models import ProduccionMIP, UtilizacionMIP, ActividadesImportacion, \
35    Productos as ProductosMIP
36import os
37import json
38import logging
39
40logger = logging.getLogger("matrizip")
41
42def 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
114def 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}))
Note: See TracBrowser for help on using the repository browser.