prefeiturasp/SME-PratoAberto-Editor

View on GitHub
analises.py

Summary

Maintainability
D
2 days
Test Coverage
import collections
import configparser
import datetime
import itertools

import requests

import db_functions


# BLOCO GET ENDPOINT E KEYS
config = configparser.ConfigParser()
config.read('config/integracao.conf')
api = config.get('ENDPOINTS', 'PRATOABERTO_API')

def dia_semana(dia):
    diasemana = ('Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab', 'Dom')
    return diasemana[dia]


def replace_cardapio(cardapio):
    config_editor = db_functions.select_all()

    for de_para in config_editor:
        cardapio = [de_para[4] if x == de_para[3] else x for x in cardapio]

    cardapio = [x for x in cardapio if x != '']
    return cardapio


def data_semana_format(text):
    date = datetime.datetime.strptime(text, "%Y%m%d").isocalendar()
    return str(date[0])+"-"+str(date[1])


def get_cardapios_iguais():
    url = api + '/cardapios?status=PENDENTE&status=SALVO'
    r = requests.get(url)
    refeicoes = r.json()

    # Formatar as chaves
    semanas = {}
    for refeicao in refeicoes:
        _key_semana = data_semana_format(refeicao['data'])
        if _key_semana in semanas.keys():
            semanas[_key_semana].append(refeicao['data'])
        else:
            semanas[_key_semana] = [refeicao['data']]

    ingredientes = collections.defaultdict(list)
    for refeicao in refeicoes:
        agrupamento = str(refeicao['agrupamento'])
        tipo_unidade = refeicao['tipo_unidade']
        tipo_atendimento = refeicao['tipo_atendimento']
        status = refeicao['status']
        idade = refeicao['idade']
        _key_semana = data_semana_format(refeicao['data'])

        for alimentos in refeicao['cardapio_original'].keys():
            _key = frozenset(replace_cardapio(refeicao['cardapio_original'][alimentos]))
            ingredientes[_key].append([agrupamento, tipo_unidade, tipo_atendimento, status, idade, _key_semana])

    return ingredientes


def open_csv():
    path = './tmp'
    file = 'Cardapios Novos.csv'

    cardapio = []
    with open(path+'/'+file, 'r', encoding='utf-8') as f:

        # REFEIÇÕES
        text = f.read().replace(' (Sopa e Fruta)', '')
        text = text.replace('(Papa Principal e Papa de Fruta)', '')
        text = text.replace('(Sopa e Fruta)', '')
        text = text.replace('(Papa de Fruta)', '')
        text = text.replace('(Papa Principal e Papa de Fruta/Suco)', '')
        text = text.replace('(Fórmula e Papa de Fruta)', '')
        text = text.replace('(Fruta)', '')
        text = text.replace('R1 - REFEICAO 1 da Tarde', 'R1 - REFEICAO 1')
        text = text.replace('A - ALMOCO (R1 - REFEICAO 1 e Fruta/Suco)', 'R1 - REFEICAO 1')
        text = text.replace('(R1 - REFEICAO 1 e Fruta/Suco)', '')

        # IDADES
        text = text.replace('7 meses', 'D - 7 MESES')
        text = text.replace('0 a 5 meses', 'D - 0 A 5 MESES')
        text = text.replace('6 meses', 'D - 6 MESES')
        text = text.replace('2 - 6 anos', 'I - 2 A 6 ANOS')
        text = text.replace('8 a 11 meses', 'E - 8 A 11 MESES')
        text = text.replace('1 ano - 1 ano e 11 meses', 'X - 1A -1A E 11MES')
        text = text.replace('TODAS', 'Z - UNIDADES SEM FAIXA')
        text = text.replace('\n', '')
        cardapio = text.split('|')

    cardapio_aux = []
    for nrow in range(0, len(cardapio), 5):
        if len(cardapio[nrow:nrow+5]) == 5:
            x = cardapio[nrow:nrow + 5]
            ingredientes = ', '.join([y.strip() for y in x[3].split(',') if y.strip() != ''])
            dsemana = datetime.datetime.strptime(x[4].strip(), '%d-%m-%Y').weekday()
            row = [x[0], x[1].strip(), x[2].strip(), ingredientes, dia_semana(dsemana)]
            cardapio_aux.append(row)

    cardapio_aux.sort()
    cardapio = list(cardapio_aux for cardapio_aux, _ in itertools.groupby(cardapio_aux))
    db_functions.truncate_receitas_terceirizadas()

    objects = []
    for row in cardapio:
        if row[3] != '':
            objects.append(['TERCEIRIZADA', row[0], 'EDITAL 78/2016', row[4], row[1], row[2], row[3]])
            # db_functions.add_cardapio('TERCEIRIZADA', row[0], 'EDITA1', row[4], row[1], row[2], row[3])

    db_functions.add_bulk_cardapio(objects)


def get_escola(cod_eol):
    url = api + '/escola/{}'.format(cod_eol)
    r = requests.get(url)
    escola = r.json()

    return escola


def get_escolas():
    url = api + '/escolas?completo'
    r = requests.get(url)
    escolas = r.json()

    return escolas


def get_escola(cod_eol):
    url = api + '/escola/{}'.format(cod_eol)
    r = requests.get(url)
    try:
        escola = r.json()
    except:
        escola = None

    return escola


def post_cardapio():
    escolas = get_escolas()
    headers = {'Content-type': 'application/json'}
    count = 0
    for escola in escolas:
        print(count)
        count += 1
        # 1. Criar o agrupamento_regiao
        # escola['agrupamento_regiao'] = escola['agrupamento']
        # 2. Se terceirizada, acrescentar o 'EDITAL 78/2016'
        if escola['tipo_atendimento'] == 'TERCEIRIZADA':
            escola['agrupamento'] = 'EDITAL 78/2016'
            escola['edital'] = 'EDITAL 78/2016'

        # 4. Criar o status com o valor 'ativo'
        escola['status'] = 'ativo'

        r = requests.post(api + '/editor/escola/{}'.format(str(escola['_id'])),
                          data=json.dumps(escola),
                          headers=headers)


def post_idades_idades():
    escolas = get_escolas()
    headers = {'Content-type': 'application/json'}
    count = 0
    dic_refeicoes = {
        'A - ALMOCO': 'A - ALMOCO',
        'AA - ALMOCO ADULTO': 'AA - ALMOCO ADULTO',
        'C - COLACAO': 'C - COLACAO',
        'D - DESJEJUM': 'D - DESJEJUM',
        'FPJ - FILHOS PRO JOVEM': 'FPJ - FILHOS PRO JOVEM',
        'J - JANTAR': 'J - JANTAR',
        'L - LANCHE': 'L - LANCHE',
        'L4 - LANCHE 4 OU LANCHE 8 HORAS': 'L4 - LANCHE 4 HORAS',
        'L5 - LANCHE 5 OU 6 HORAS': 'L5 - LANCHE 5 HORAS',
        'L5 - LANCHE 5 OU LANCHE 6 HORAS': 'L5 - LANCHE 5 HORAS',
        'MI - MERENDA INICIAL': 'MI - MERENDA INICIAL',
        'MS - MERENDA SECA': 'MS - MERENDA SECA',
        'R1 - REFEICAO 1': 'R1 - REFEICAO 1',
        'R2 - REFEICAO 2': 'R2 - REFEICAO 2',
        'HE - HORARIO ESTENDIDO': 'HE - HORARIO ESTENDIDO',
        'LP - LANCHE PASSEIO': 'LP - LANCHE PASSEIO',
        'L - LANCHE CEMEI': 'L - LANCHE CEMEI',
        'R - REFEICAO CEMEI':  'R - REFEICAO CEMEI'
    }

    for escola in escolas:
        count += 1
        if 'refeicoes' in escola.keys():

            refeicao_aux = []
            for refeicao in escola['refeicoes']:
                if refeicao in dic_refeicoes.keys():
                    refeicao_aux.append(dic_refeicoes[refeicao])
                else:
                    refeicao_aux.append(refeicao)
            if refeicao_aux != escola['refeicoes']:
                print(count, escola['_id'], refeicao_aux, escola['refeicoes'])
            escola['refeicoes'] = refeicao_aux

            refeicao_aux = []
            if 'historico' in escola.keys():
                if escola['historico'] != []:
                    for refeicao in escola['historico']['refeicoes']:
                        if refeicao in dic_refeicoes.keys():
                            refeicao_aux.append(dic_refeicoes[refeicao])
                        else:
                            refeicao_aux.append(refeicao)
                        escola['historico']['refeicoes'] = refeicao_aux


            r = requests.post(api + '/editor/escola/{}'.format(str(escola['_id'])),
                              data=json.dumps(escola),
                              headers=headers)


def post_ordenar_refeicoes():
    escolas = get_escolas()
    headers = {'Content-type': 'application/json'}
    count = 0

    refeicoes_ordenadas = ['MI - MERENDA INICIAL',
                           'D - DESJEJUM',
                           'C - COLACAO',
                           'AA - ALMOCO ADULTO',
                           'A - ALMOCO',
                           'L - LANCHE',
                           'L4 - LANCHE 4 HORAS',
                           'L5 - LANCHE 5 HORAS',
                           'R1 - REFEICAO 1',
                           'R2 - REFEICAO 2',
                           'MS - MERENDA SECA',
                           'FPJ - FILHOS PRO JOVEM',
                           'J - JANTAR',
                           'HE - HORARIO ESTENDIDO'
                           'LP - LANCHE PASSEIO',
                           'L - LANCHE CEMEI',
                           'R - REFEICAO CEMEI']

    for escola in escolas:
        count += 1
        print(escola['_id'], count)
        if 'refeicoes' in escola.keys():
            lista_ordenada = [x for x in refeicoes_ordenadas if x in escola['refeicoes']]
            print(escola['refeicoes'], lista_ordenada)
            escola['refeicoes'] = lista_ordenada


        if 'historico' in escola.keys():
            if escola['historico'] != []:
                if 'refeicoes' in escola['historico'].keys():
                    lista_ordenada = [x for x in refeicoes_ordenadas if x in escola['refeicoes']]
                    escola['historico']['refeicoes'] = lista_ordenada

        r = requests.post(api + '/editor/escola/{}'.format(str(escola['_id'])),
                          data=json.dumps(escola),
                          headers=headers)


def post_cardapio_add_merendas():
    FILE = './tmp/Escolas x Tipo Refeição_Texto'

    with open(FILE, 'r', encoding="ISO-8859-1") as f:
        refeicao_escola = {}
        for row in f.readlines():
            data = row.replace("'", '').replace('\n', '').split(', ')
            if data[0] in refeicao_escola.keys():
                refeicao_escola[data[0]].append(data[1])
            else:
                refeicao_escola[data[0]] = []
                refeicao_escola[data[0]].append(data[1])

    headers = {'Content-type': 'application/json'}
    count = 0
    for _id in refeicao_escola.keys():
        print(str(count) + ' - ' + api + '/editor/escola/{}'.format(str(_id)))
        escola = get_escola(_id)
        if escola == None:
            print(_id)
            pass
        else:
            escola['_id'] = int(_id)
            escola['refeicoes'] = refeicao_escola[_id]
            # print(str(count) + ' - ' + api + '/editor/escola/{}'.format(str(escola['_id'])))
            r = requests.post(api + '/editor/escola/{}'.format(str(escola['_id'])),
                          data=json.dumps(escola),
                          headers=headers)
        count += 1


def get_quebras_escolas():
    escolas = get_escolas()
    mapa_base = collections.defaultdict(list)
    for escola in escolas:
        agrupamento = str(escola['agrupamento'])
        tipo_unidade = escola['tipo_unidade']
        tipo_atendimento = escola['tipo_atendimento']
        if 'idades' in escola.keys():
            for idade in escola['idades']:
                _key = ', '.join([agrupamento, tipo_unidade, tipo_atendimento, idade])
                mapa_base[_key].append(escola['_id'])
        else:
            pass
            # print(escola)

    mapa = []
    for row in mapa_base:
        mapa.append(row.split(', ') + [len(mapa_base[row])] + [mapa_base[row][0]])

    return mapa


def get_cardapio(args):
    url = api + '/editor/cardapios?' + '&'.join(['%s=%s' % item for item in args.items()])
    r = requests.get(url)
    refeicoes = r.json()

    return refeicoes


def mapa_pendencias():
    mapa = get_quebras_escolas()

    delta_dias = datetime.timedelta(days=7)
    dia_semana_seguinte = datetime.datetime.now() + delta_dias
    semana = [dia_semana_seguinte + datetime.timedelta(days=i) for i in range(0 - dia_semana_seguinte.weekday(), 7 - dia_semana_seguinte.weekday())]
    dia_inicial = min(semana).strftime("%Y%m%d")
    dia_final = max(semana).strftime("%Y%m%d")

    dia_inicial = 20170918
    dia_final = 20170922

    # Por padrão, sempre colocaremos o cardápio da semana seguinte
    mapa_final = []
    for row in mapa:
        args = {'agrupamento': row[0],
                'tipo_unidade': row[1],
                'tipo_atendimento': row[2],
                'idade': row[3],
                'status': 'SALVO',
                'status': 'PUBLICADO',
                'data_inicial': dia_inicial,
                'data_final': dia_final}

        cardapio = get_cardapio(args)
        if cardapio == []:
            args['status_publicacao'] = 0
            mapa_final.append(args)
            print(str(0), row)
        else:
            args['status_publicacao'] = 1
            mapa_final.append(args)
            print(str(1), row)


def update_receitas_terceirizadas():
    r = db_functions.select_all_receitas_terceirizadas()
    modificacoes = []
    for row in r:
        row_aux = list(row[1:])
        # Atualiza
        if row_aux[1] == 'CEI':
            # row_aux = list(row_aux)
            row_aux[1] = 'CEI_MUNICIPAL'
            if row_aux[5] == 'R1 - REFEICAO 1':
                row_aux[5] = 'J - JANTAR'

            if row_aux[5] == 'L4 - LANCHE 4 HORAS':
                row_aux[5] = 'L - LANCHE'

            # Adiciona CCI - Cópia CEI
            row_aux_CCI = row_aux.copy()
            row_aux_CCI[1] = 'CCI'
            modificacoes.append(row_aux_CCI)
        modificacoes.append(row_aux)

    modificacoes.sort()
    modificacoes = list(modificacoes for modificacoes, _ in itertools.groupby(modificacoes))

    db_functions.truncate_receitas_terceirizadas()
    db_functions.add_bulk_cardapio(modificacoes)


def get_cardapios():
    url = api + '/editor/cardapios?status=PENDENTE&status=SALVO&status=PUBLICADO'
    r = requests.get(url)
    refeicoes = r.json()

    for refeicao in refeicoes:
        if refeicao['tipo_atendimento'] == 'TERCEIRIZADA':
            if refeicao['tipo_unidade'] == 'CEI':
                refeicao['tipo_unidade'] = 'CEI_MUNICIPAL'
                print(refeicao['status'], refeicao)
                headers = {'Content-type': 'application/json'}
                data = json.dumps([refeicao])
                res = requests.post(api + '/editor/cardapios', data=data, headers=headers)

if __name__ == '__main__':
    # open_csv()
    import json

    get_cardapios()