Пример #1
0
def crea_xls_commessa(request, id_commessa):

    commessa = get_object_or_404(Commessa, pk=id_commessa)

    ## http://stackoverflow.com/a/27405896/529323
    output = io.BytesIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    sheet = workbook.add_worksheet()
    sheet.set_paper(8)  # A3
    sheet.set_landscape()

    stili = crea_stili(workbook)

    riga = 0
    sheet.set_row(riga, 34)
    sheet.merge_range(riga, 11, riga, 20, 'MR FERRO S.R.L.', stili['big'])

    # la larghezza di default di una colonna è circa 8.
    sheet.set_column('A:A', 12)  # 8 + 4
    sheet.set_column('M:M', 4)  # 8 - 4

    bandiera_params = {
        'x_scale': 0.75,
        'y_scale': 0.75,
        'x_offset': 8,
        'y_offset': 5
    }
    checkbox_params = {
        'x_scale': 0.7,
        'y_scale': 0.7,
        'x_offset': 0,
        'y_offset': 1
    }
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/bandiera_italiana.jpg".format(
            settings.XLS_IMAGE_PATH), bandiera_params)

    riga += 1
    mr_ferro = Entita.objects.proprietario()
    indirizzo = mr_ferro.get_indirizzo(SEDE_OPERATIVA, 'su_due_righe_con_cap')
    sheet.merge_range(riga, 11, riga, 20, indirizzo[0],
                      stili['testo-centrato'])
    riga += 1
    sheet.merge_range(riga, 11, riga, 20, indirizzo[1],
                      stili['testo-centrato'])

    riga += 2
    sheet.set_row(riga, 24)
    sheet.merge_range(riga, 11, riga, 17, 'SCHEDA DI COMMESSA',
                      stili['medium_sinistra'])

    #riga += 1
    sheet.write(riga, 18, 'DATA', stili['testo-centrato'])
    sheet.merge_range(riga, 19, riga, 20, 'FIRMA', stili['testo-centrato'])

    riga += 1
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      ORDINE DI LAVORAZIONE REGISTRATO DA OFFICINA', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      RIESAME TECNICO CONTRATTUALE', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      CONTROLLO VISIVO-DIMENSIONALE STRUTTURA', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      CONTROLLO IN PROCESS DELLE SALDATURE', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      RIESAME DI PROGETTO/REQUISITI PER SALDATURA', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      WPS APPLICABILE', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])
    riga += 1
    sheet.merge_range(riga, 11, riga, 20, '', \
        stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      DISEGNI/PROGETTO ESECUTIVO', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      CERTIFICATI MATERIALE', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      DOCUMENTI SICUREZZA (POS - DURC - ecc.)', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      SEQUENZA DI MONTAGGIO', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      ISTRUZIONI DI MONTAGGIO', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 1
    sheet.write(riga, 18, 'DATA ESEC.', stili['testo-centrato'])
    sheet.merge_range(riga, 19, riga, 20, 'FIRMA', stili['testo-centrato'])

    riga += 1
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      CONTROLLO DI SALDATURA INIZIALE', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.insert_image(
        riga, 11, "{}anagrafiche/static/img/checkbox.jpg".format(
            settings.XLS_IMAGE_PATH), checkbox_params)
    sheet.merge_range(riga, 11, riga, 17, '      TIPO DI CONTROLLO []VT []PT []MT [] RT []UT []...', \
        stili['bordo_sotto'])
    sheet.write(riga, 18, '', stili['bordo_a_u'])
    sheet.merge_range(riga, 19, riga, 20, '', stili['bordo_sotto'])

    riga += 2
    sheet.merge_range(riga, 11, riga, 20, 'PRODOTTO', stili['bold-centrato'])
    riga += 1
    sheet.set_row(riga, 24)
    sheet.merge_range(riga, 11, riga, 20, commessa.prodotto,
                      stili['bold-centrato-bg_pink'])

    riga += 1
    sheet.merge_range(riga, 11, riga, 20, 'COMMESSA', stili['bold-centrato'])
    riga += 1
    sheet.set_row(riga, 24)
    sheet.merge_range(riga, 11, riga, 20, commessa.codice,
                      stili['bold-centrato-bg_pink'])

    riga += 1
    sheet.merge_range(riga, 11, riga, 20, 'COMMITTENTE',
                      stili['bold-centrato'])
    riga += 1
    sheet.set_row(riga, 24)
    sheet.merge_range(riga, 11, riga, 20, commessa.cliente.get_nome_completo(),
                      stili['bold-centrato-bg_pink'])

    riga += 1
    sheet.merge_range(riga, 11, riga, 20, 'DATA APERTURA',
                      stili['bold-centrato'])
    riga += 1
    sheet.set_row(riga, 24)
    sheet.merge_range(riga, 11, riga, 20, commessa.data_apertura,
                      stili['bold-centrato-bg_pink-data'])

    riga += 2
    sheet.merge_range(riga, 11, riga, 20, 'RIF. PROGETTO: ', stili['boxed'])
    riga += 1
    sheet.set_row(riga, 24)
    sheet.merge_range(riga, 11, riga, 20, 'RIF. PROGETTO: ', stili['boxed'])

    workbook.close()
    output.seek(0)
    response = HttpResponse(
        output.read(),
        content_type=
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    response['Content-Disposition'] = "attachment; filename=scheda commessa " \
        + commessa.codice + ".xlsx"
    return response
Пример #2
0
def crea_xls_bolla_fornitore(request, id_bolla):

    bolla = get_object_or_404(BollaFornitore, pk=id_bolla)
    u = request.user 
    if not u.has_perm('anagrafiche._bollaFornitore:*'):
        ctx = {}
        ctx['msg'] = 'Non hai i permessi per aprire questa pagina.'
        return render(request, 'anagrafiche/msg.html', ctx)

    ## http://stackoverflow.com/a/27405896/529323
    output = io.BytesIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    sheet = workbook.add_worksheet()
    sheet.set_paper(9)  # A4
    #sheet.set_margins(0.24, 0.24, 0.47, 0.11)

    # larghezza colonne
    sheet.set_column('A:A', 5)
    sheet.set_column('B:B', 12)
    sheet.set_column('C:C', 7)
    sheet.set_column('D:D', 4)
    sheet.set_column('E:E', 9)
    sheet.set_column('F:F', 13)
    sheet.set_column('G:G', 4)
    sheet.set_column('H:H', 4)
    sheet.set_column('I:I', 11)
    sheet.set_column('J:J', 11)

    stili = crea_stili(workbook)
    
    logo_params =  {
        'x_scale': 0.40,
        'y_scale': 0.65,
    }
    riga = 0
    pagebreaks = []

    for copia in ('MITTENTE', 'DESTINATARIO', 'VETTORE'):

        sheet.merge_range(riga, 0, riga, 9, 'DOCUMENTO DI TRASPORTO (D.d.t.) - COPIA {}'.format(copia), stili['bold-centrato-bg_gray'])

        riga += 2
        sheet.insert_image(riga, 0, "{}anagrafiche/static/img/mrFerro.jpg".format(settings.XLS_IMAGE_PATH), 
            logo_params)

        sheet.merge_range(riga, 5, riga, 9, get_ragione_sociale(bolla.data), stili['bold'])
        riga += 1
        sheet.merge_range(riga, 5, riga, 9, get_indirizzo_proprietario())
        #riga += 1
        #sheet.merge_range(riga, 5, riga, 9, 'Sede operativa: via Lago d\'Iseo, 5 - 24060 Bolgare (BG)')
        riga += 1
        sheet.merge_range(riga, 5, riga, 9, 'Tel. e Fax 035.4499168')
        riga += 1
        sheet.merge_range(riga, 5, riga, 9,'E-mail: [email protected] / [email protected]')
        riga += 1
        sheet.merge_range(riga, 5, riga, 9, 'Reg. Imp. BG - C.F. E P.IVA 03362370169')
        riga += 2

        #sheet.merge_range('A10:B10', 'ORDINE', stili['bold-centrato-bg_gray'])
        #sheet.merge_range('D10:G10', 'CLIENTE', stili['bold-centrato-bg_gray'])

        dati_fornitore = get_dati_entita(bolla.fornitore)    
        
        sheet.set_row(riga, 30)
        sheet.write(riga, 0, 'Ditta', stili['italic-bg_gray'])
        sheet.merge_range(riga, 1, riga, 2, dati_fornitore['nome_completo'], stili['boxed'])
        sheet.write(riga, 3, 'Tel.', stili['italic-bg_gray'])
        sheet.merge_range(riga, 4, riga, 5, dati_fornitore['numero_telefono'], stili['boxed'])
        sheet.merge_range(riga, 6, riga, 7, 'Numero Doc.', stili['italic-bg_gray'])
        sheet.merge_range(riga, 8, riga, 9, bolla.codice, stili['boxed'])
        riga += 1

        sheet.set_row(riga, 30)
        sheet.write(riga, 0, 'Via e N°', stili['italic-bg_gray'])
        sheet.merge_range(riga, 1, riga, 2, dati_fornitore['via'], stili['boxed'])
        sheet.write(riga, 3, 'Fax', stili['italic-bg_gray'])
        sheet.merge_range(riga, 4, riga, 5, dati_fornitore['numero_fax'], stili['boxed'])
        sheet.merge_range(riga, 6, riga, 7, 'Data', stili['italic-bg_gray'])
        sheet.merge_range(riga, 8, riga, 9, bolla.data, stili['date-left'])
        riga += 1

        sheet.set_row(riga, 30)
        sheet.write(riga, 0, 'Città', stili['italic-bg_gray'])
        sheet.merge_range(riga, 1, riga, 2, dati_fornitore['citta_e_pr'], stili['boxed'])
        sheet.write(riga, 3, 'Dest.', stili['italic-bg_gray-no_wrap'])
        sheet.merge_range(riga, 4, riga, 5, bolla.destinazione.get_indirizzo_corto(), stili['boxed'])
        """
        sheet.merge_range('G12:H12', 'Ordine e data ord.', stili['italic-bg_gray'])
        sheet.merge_range('I12:J12', "{} del {}".format(bolla.ordine.codice, bolla.data), stili['boxed'])
        """
        sheet.merge_range(riga, 6, riga, 7, 'Commessa', stili['italic-bg_gray-medium'])
        sheet.merge_range(riga, 8, riga, 9, bolla.commessa.codice, stili['boxed'])
        riga += 1

        """
        sheet.write('A13', 'Alla \nC. A.', stili['italic-bg_gray'])
        sheet.merge_range('B13:C13', ordine.persona_di_riferimento, stili['boxed'])
        sheet.write('D13', 'Mail', stili['italic-bg_gray'])
        sheet.merge_range('E13:F13', dati_fornitore['email'], stili['boxed'])
        #sheet.merge_range('G13:J13', '', stili['border-bottom-right'])
        """

        riga += 1
        sheet.set_row(riga, 30)
        sheet.merge_range(riga, 0, riga, 7, 'DESCRIZIONE', stili['bold-centrato-bg_gray'])
        sheet.write(riga, 8, 'UNITÀ DI MISURA', stili['bold-centrato-bg_gray'])
        sheet.write(riga, 9, 'QUANTITÀ', stili['bold-centrato-bg_gray'])
        
        riga += 1
        righe = bolla.righe.all().filter(cancellato=False).order_by('riga_ordine__ordine')
        
        ordine = None
        for r in righe:
            if r.riga_ordine != None and r.riga_ordine.ordine !=ordine:
                # a parte il primo ordine, lascia una riga vuota tra i prodotti di un
                # ordine e l'altro.
                if ordine != None:
                    riga += 1 

                ordine = r.riga_ordine.ordine
                sheet.merge_range(riga, 0, riga, 7, 
                    '    Ordine {} del {}:'.format(ordine.codice, ordine.data.strftime('%d/%m/%Y'))
                    , stili['cella-riga'])
                sheet.write(riga, 8, '', stili['cella-riga'])
                sheet.write(riga, 9, '', stili['cella-riga'])
                riga += 1

            # la lunghezza della descrizione può arrivare a 1000 caratteri. Cerco di prevedere 
            # quando deve essere alta la riga contando i caratteri della descrizione:
            altezza_riga = get_altezza_cella(r.articolo_descrizione)
            sheet.set_row(riga, altezza_riga)
            sheet.merge_range(riga, 0, riga, 7, r.articolo_descrizione, stili['cella-riga'])
            sheet.write(riga, 8, r.get_articolo_unita_di_misura_display(), stili['cella-riga'])
            sheet.write(riga, 9, r.quantita, stili['cella-riga'])
            
            riga += 1

        vettore = bolla.vettore
        riga += 1
        sheet.merge_range(riga, 0, riga, 4, 'VETTORE', stili['bold-centrato-bg_gray_small'])
        sheet.merge_range(riga, 5, riga, 9, '', stili['bold-centrato-bg_gray_small'])
        
        riga += 1
        sheet.merge_range(riga, 0, riga, 4, 
            '{}'.format(vettore.get_nome_completo() if vettore else ''),
             stili['border-left_small'])
        sheet.merge_range(riga, 5, riga, 6, 'Causale:', stili['border-left_small'])
        sheet.merge_range(riga, 7, riga, 9, 
            '{}'.format(bolla.causale_trasporto.descrizione if bolla.causale_trasporto else ''),
             stili['border-right_small'])
        
        riga += 1
        sheet.merge_range(riga, 0, riga, 4, 
            'P. IVA {}'.format(vettore.partita_iva) if vettore else '',
             stili['border-left_small'])
        sheet.merge_range(riga, 5, riga, 6, 'Incoterm:', stili['border-left_small'])
        sheet.merge_range(riga, 7, riga, 9, 
            '{}'.format(bolla.porto.descrizione if bolla.porto else ''),
             stili['border-right_small'])
        
        riga += 1
        sheet.merge_range(riga, 0, riga, 4, 
            '{}'.format(vettore.get_indirizzo_in_due_campi(SEDE_LEGALE)[0] if vettore else ''),
             stili['border-left_small'])
        sheet.merge_range(riga, 5, riga, 6, 'Tipo trasporto:', stili['border-left_small'])
        sheet.merge_range(riga, 7, riga, 9, 
            '{}'.format(bolla.trasporto_a_cura.descrizione if bolla.trasporto_a_cura else ''),
             stili['border-right_small'])
        
        riga += 1
        sheet.merge_range(riga, 0, riga, 4, 
            '{}'.format(vettore.get_indirizzo_in_due_campi(SEDE_LEGALE)[1] if vettore else ''),
             stili['border-left_small'])
        sheet.merge_range(riga, 5, riga, 6, 'Aspetto esteriore:', stili['border-left_small'])
        sheet.merge_range(riga, 7, riga, 9, 
            '{}'.format(bolla.aspetto_esteriore.descrizione if bolla.aspetto_esteriore else ''),
             stili['border-right_small'])

        #riga += 1
        #sheet.merge_range(riga, 0, riga, 9, 'INFO', stili['bold-centrato-bg_gray_small'])
        riga += 1
        
        if bolla.peso_netto != None and bolla.peso_netto != "0":
            pn = "Peso netto: {}".format(bolla.peso_netto)
        else:
            pn = "Peso netto:"

        if bolla.peso_lordo != None and bolla.peso_lordo != "0":
            pl = "Peso lordo: {}".format(bolla.peso_lordo)
        else:
            pl = "Peso lordo:"

        if bolla.numero_colli != None and bolla.numero_colli != 0:
            nc = "Numero colli: {}".format(bolla.numero_colli)
        else:
            nc = "Numero colli:"

        sheet.merge_range(riga, 0, riga, 2, pn, stili['boxed_small'])
        sheet.merge_range(riga, 3, riga, 5, pl, stili['boxed_small'])
        sheet.merge_range(riga, 6, riga, 9, nc, stili['boxed_small'])

        if bolla.causale_trasporto.is_conto_lavorazione():
            riga += 1
            sheet.set_row(riga, 26)
            frase_verniciatura = ('Verniciare secondo la norma EN ISO 12944 in classe di ' \
                + 'corrosività "{}" ed in conformità alla ns. IO7401 rev.01. Allegare ' \
                + 'dichiarazione di conformità.').format(bolla.classe_di_corrosivita)
            sheet.merge_range(riga, 0, riga, 9, frase_verniciatura, stili['testo-a-capo-boxed_small'])
            riga += 1
            frase_zincatura = 'Zincare in accordo alla norma ISO 1461 e in conformità alla ns. ' \
                + 'IO7401 rev.01 e allegare dichiarazione di conformità.'
            sheet.merge_range(riga, 0, riga, 9, frase_zincatura, stili['testo-a-capo-boxed_small'])


        if bolla.note: 
            riga += 1
            sheet.merge_range(riga, 0, riga, 9, 'NOTE', stili['bold-centrato-bg_gray_small'])
            riga += 1
            sheet.merge_range(riga, 0, riga, 9, bolla.note, stili['testo-a-capo-boxed_small'])



        riga += 1
        sheet.merge_range(riga, 0, riga, 4, 'FIRMA CONDUCENTE', stili['bold-centrato-bg_gray_small'])
        sheet.merge_range(riga, 5, riga, 9, 'FIRMA CLIENTE', stili['bold-centrato-bg_gray_small'])
        riga += 1
        sheet.set_row(riga, 30)
        sheet.merge_range(riga, 0, riga, 4, '', stili['boxed'])
        sheet.merge_range(riga, 5, riga, 9, '', stili['boxed'])
        
        riga += 1
        pagebreaks.append(riga)

    # end for usato per creare le 3 copie

    footer1 = '&L&7Documento realizzato con un programma dello Studio Gamma Snc.\nwww.studiogammasnc.it'
    sheet.set_footer(footer1)

    sheet.set_h_pagebreaks(pagebreaks)
    workbook.close()
    output.seek(0)
    response = HttpResponse(output.read(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    response['Content-Disposition'] = "attachment; filename=bolla " + bolla.codice + ".xlsx"
    return response
Пример #3
0
def crea_xls_fattura_cliente(request, id_fattura):

    # deve essere definita prima della funzione scrivi_righe_con_bolla che usa questa variabile
    global riga
    global salta_una_riga_dopo_bolle
    global salta_una_riga_dopo_righe_senza_bolle

    # reset delle variabili globali o si hanno problemi stampando più di una fattura
    riga = 0
    salta_una_riga_dopo_bolle = False
    salta_una_riga_dopo_righe_senza_bolle = False

    fattura = get_object_or_404(FatturaCliente, pk=id_fattura)
    u = request.user
    if not u.has_perm('anagrafiche._fatturaCliente:*'):
        ctx = {}
        ctx['msg'] = 'Non hai i permessi per aprire questa pagina.'
        return render(request, 'anagrafiche/msg.html', ctx)

    # fattura.aliquota_IVA.percentuale
    if not fattura.aliquota_IVA:
        ctx = {}
        ctx['msg'] = 'Seleziona un\'aliquota IVA prima di stampare la fattura.'
        return render(request, 'anagrafiche/msg.html', ctx)

    # http://stackoverflow.com/a/27405896/529323
    output = io.BytesIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    sheet = workbook.add_worksheet()
    sheet.set_paper(9)  # A4
    # sheet.set_margins(0.24, 0.24, 0.47, 0.11)

    # larghezza colonne
    sheet.set_column('A:A', 15)
    sheet.set_column('B:B', 26)
    sheet.set_column('C:C', 5)
    sheet.set_column('D:D', 11)
    sheet.set_column('E:E', 3)
    sheet.set_column('F:F', 13)
    sheet.set_column('G:G', 9)

    stili = crea_stili(workbook)

    logo_params = {
        'x_scale': 0.40,
        'y_scale': 0.65,
    }

    pagebreaks = []

    sheet.merge_range(riga, 0, riga, 6, 'FATTURA COMMERCIALE',
                      stili['bold-centrato-bg_gray'])

    riga += 2
    sheet.insert_image(
        riga, 0,
        "{}anagrafiche/static/img/mrFerro.jpg".format(settings.XLS_IMAGE_PATH),
        logo_params)
    sheet.merge_range(riga, 3, riga, 6, get_ragione_sociale(fattura.data),
                      stili['bold'])
    riga += 1
    sheet.merge_range(riga, 3, riga, 6, get_indirizzo_proprietario(),
                      stili['c8'])
    # riga += 1
    # sheet.merge_range(riga, 3, riga, 6, 'Sede operativa: via Lago d\'Iseo, 5 - 24060 Bolgare (BG)',
    #    stili['c8'])
    riga += 1
    sheet.merge_range(riga, 3, riga, 6, 'Tel. e Fax 035.4499168', stili['c8'])
    riga += 1
    sheet.merge_range(riga, 3, riga, 6,
                      'E-mail: [email protected] / [email protected]',
                      stili['c8'])
    riga += 1
    sheet.merge_range(riga, 3, riga, 6,
                      'Reg. Imp. BG - C.F. E P.IVA 03362370169', stili['c8'])
    riga += 2

    # sheet.merge_range('A10:B10', 'ORDINE', stili['bold-centrato-bg_gray'])
    # sheet.merge_range('D10:G10', 'CLIENTE', stili['bold-centrato-bg_gray'])

    dati_cliente = get_dati_entita(fattura.cliente)

    sheet.merge_range(riga, 0, riga, 1, 'FATTURA COMMERCIALE',
                      stili['bold-centrato-bg_gray'])
    sheet.merge_range(riga, 3, riga, 6, 'CLIENTE',
                      stili['bold-centrato-bg_gray'])
    riga += 1

    # sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Fattura nr.', stili['boxed_c11_italic_shrinked'])
    sheet.write(riga, 1, fattura.codice, stili['shrinked_c11_boxed'])
    sheet.write(riga, 3, 'Spett.le', stili['boxed_c11_italic_shrinked'])
    sheet.merge_range(riga, 4, riga, 6, fattura.cliente.get_nome_completo(),
                      stili['shrinked_c11_boxed'])
    riga += 1

    via_sede_legale, paese_sede_legale = fattura.cliente.get_indirizzo_in_due_campi(
        SEDE_LEGALE)
    sheet.write(riga, 0, 'Data', stili['boxed_c11_italic_shrinked'])
    sheet.write(riga, 1, fattura.data, stili['date_left_boxed'])
    sheet.write(riga, 3, 'Sede Legale', stili['boxed_c11_italic_shrinked'])
    sheet.merge_range(riga, 4, riga, 6,
                      fattura.cliente.get_indirizzo(SEDE_LEGALE),
                      stili['shrinked_c11_boxed'])
    riga += 1

    sheet.write(riga, 0, 'Vs. Ordine nr.', stili['boxed_c11_italic_shrinked'])
    sheet.write(riga, 1, fattura.riferimento_cliente,
                stili['shrinked_c11_boxed'])
    sheet.write(riga, 3, 'Sede Amm.', stili['boxed_c11_italic_shrinked'])
    sheet.merge_range(riga, 4, riga, 6,
                      fattura.cliente.get_indirizzo(SEDE_AMMINISTRATIVA),
                      stili['shrinked_c11_boxed'])
    riga += 1

    if fattura.commessa:
        sheet.write(riga, 0, 'Commessa', stili['boxed_c11_italic_shrinked'])
        sheet.write(riga, 1, fattura.commessa.codice,
                    stili['shrinked_c11_boxed'])
    else:
        via_sede_amm, paese_sede_amm = fattura.cliente.get_indirizzo_in_due_campi(
            SEDE_AMMINISTRATIVA)
        sheet.write(riga, 0, 'Modalità di pagamento',
                    stili['boxed_c11_italic_shrinked'])
        sheet.write(riga, 1, fattura.pagamento.__str__(),
                    stili['shrinked_c11_boxed'])
    sheet.write(riga, 3, 'P. IVA', stili['boxed_c11_italic_shrinked'])
    sheet.merge_range(riga, 4, riga, 6, fattura.cliente.partita_iva,
                      stili['shrinked_c11_boxed'])
    riga += 1

    # Tolto il campo 'Scadenze' (come da richiesta di Anna) perché è inutile se non è valorizzato.
    # sheet.write(riga, 0, 'Scadenze', stili['boxed_c11_italic_shrinked'])
    # sheet.write(riga, 1, '', stili['shrinked_c11_boxed'])

    # Se alla riga sopra abbiamo scritto la commessa, qua dobbiamo scrivere i dettagli di pagamento. Altrimenti lascimao
    # le due celle della sezione di sinistra vuote
    if fattura.commessa:
        via_sede_amm, paese_sede_amm = fattura.cliente.get_indirizzo_in_due_campi(
            SEDE_AMMINISTRATIVA)
        sheet.write(riga, 0, 'Modalità di pagamento',
                    stili['boxed_c11_italic_shrinked'])
        sheet.write(riga, 1, fattura.pagamento.__str__(),
                    stili['shrinked_c11_boxed'])

    sheet.write(riga, 3, 'Cod. Fiscale', stili['boxed_c11_italic_shrinked'])
    sheet.merge_range(riga, 4, riga, 6, fattura.cliente.codice_fiscale,
                      stili['shrinked_c11_boxed'])
    riga += 1

    riga += 1
    sheet.set_row(riga, 30)
    sheet.merge_range(riga, 0, riga, 1, 'DESCRIZIONE',
                      stili['bold-centrato-bg_gray'])
    sheet.write(riga, 2, 'Q.TÀ', stili['bold-centrato-bg_gray'])
    sheet.merge_range(riga, 3, riga, 4, 'PREZZO UNITARIO',
                      stili['bold-centrato-bg_gray'])
    sheet.write(riga, 5, 'IMPORTO', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 6, 'IVA %', stili['bold-centrato-bg_gray'])

    riga += 1

    # ci sono tre casi da testare: solo righe senza bolle, solo righe appartenenti a bolle,
    # righe con e senza bolle.
    # righe solo senza bolle:     vedere Fattura FC160007
    # righe solo con bolle:       vedere Fattura FC160016
    # righe con e senza bolle:    vedere Fattura FC160012 (poi diventerà FC160205 credo)

    if settings.STAMPA_PRIMA_BOLLE_SU_FATTURA:
        scrivi_righe_con_bolla(fattura, sheet, stili)
        scrivi_righe_senza_bolla(fattura, sheet, stili)
    else:
        scrivi_righe_senza_bolla(fattura, sheet, stili)
        scrivi_righe_con_bolla(fattura, sheet, stili)
    """
    righe = fattura.righe.all().filter(cancellato=False).order_by('riga_bolla__bolla')
    
    bolla = None
    for r in righe:
        if r.riga_bolla != None and r.riga_bolla.bolla != bolla:
            # a parte la prima bolla, lascia una riga vuota tra i prodotti di una
            # bolla e l'altra.
            if bolla != None:
                riga += 1 

            bolla = r.riga_bolla.bolla
            sheet.merge_range(riga, 0, riga, 6, 
                '    Bolla {} del {}:'.format(bolla.codice, bolla.data.strftime('%d/%m/%Y'))
                , stili['cella-riga'])
            #sheet.write(riga, 8, '', stili['cella-riga'])
            #sheet.write(riga, 9, '', stili['cella-riga'])
            riga += 1

        # la lunghezza della descrizione può arrivare a 1000 caratteri. Cerco di prevedere 
        # quando deve essere alta la riga contando i caratteri della descrizione:
        altezza_riga = get_altezza_cella(r.articolo_descrizione, caratteri_per_cella=24)
        sheet.set_row(riga, altezza_riga)
        sheet.merge_range(riga, 0, riga, 1, r.articolo_descrizione, stili['cella-riga'])
        sheet.write(riga, 2, r.quantita, stili['cella-riga-centrato'])
        sheet.merge_range(riga, 3, riga, 4, r.articolo_prezzo, stili['cella-riga-soldi-anna'])
        sheet.write(riga, 5, r.totale, stili['cella-riga-soldi-anna'])
        sheet.write(riga, 6, "{} %".format(fattura.aliquota_IVA.percentuale), 
            stili['cella-riga-centrato'])
        riga += 1
    """
    """
    if fattura.note: 
        riga += 1
        sheet.merge_range(riga, 0, riga, 9, 'NOTE', stili['bold-centrato-bg_gray_small'])
        riga += 1
        sheet.merge_range(riga, 0, riga, 9, fattura.note, stili['testo-a-capo-boxed_small'])
    """

    # sheet.write(riga, 1, "CONTRIBUTO AMBIENTALE CONAI ASSOLTO", stili['shrinked'])
    sheet.merge_range(riga, 1, riga, 2, "CONTRIBUTO AMBIENTALE CONAI ASSOLTO",
                      stili['shrinked'])
    sheet.merge_range(riga, 3, riga, 4, 'IMPONIBILE', stili['imponibile'])
    sheet.merge_range(riga, 5, riga, 6, fattura.imponibile,
                      stili['imponibile_value'])

    if fattura.imponibile_netto != fattura.imponibile:
        riga += 1
        sheet.merge_range(riga, 3, riga, 4, 'IMP. SCONTATO', stili['iva'])
        sheet.merge_range(riga, 5, riga, 6, fattura.imponibile_netto,
                          stili['imponibile_value'])

    riga += 1
    if fattura.aliquota_IVA.percentuale != 0:
        # scrivi il totale dell'IVA
        sheet.merge_range(riga, 3, riga, 4,
                          'IVA {}%'.format(fattura.aliquota_IVA.percentuale),
                          stili['iva'])
        sheet.merge_range(riga, 5, riga, 6, fattura.totale_iva,
                          stili['iva_value'])
    else:
        # scrivi l'esenzione IVA
        sheet.set_row(riga, 30)
        sheet.merge_range(riga, 3, riga, 4, '', stili['iva'])
        sheet.merge_range(riga, 5, riga, 6, fattura.aliquota_IVA.descrizione,
                          stili['iva_esenzione'])
    riga += 1
    sheet.set_row(riga, 30)
    sheet.merge_range(riga, 3, riga, 4, 'TOTALE\nFATTURA',
                      stili['totale_fattura'])
    sheet.merge_range(riga, 5, riga, 6, fattura.totale,
                      stili['totale_fattura_value'])

    footer1 = '&L&7Documento realizzato con un programma dello Studio Gamma Snc.\nwww.studiogammasnc.it&R&7Pagina &P' \
              + ' di &N\n'
    sheet.set_footer(footer1)

    workbook.close()
    output.seek(0)
    response = HttpResponse(
        output.read(),
        content_type=
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    response[
        'Content-Disposition'] = "attachment; filename=fattura " + fattura.codice + ".xlsx"
    return response
Пример #4
0
def crea_xls_ordine_fornitore(request, id_ordine):

    ordine = get_object_or_404(OrdineFornitore, pk=id_ordine)
    uu = request.user 
    if not uu.has_perm('anagrafiche._ordineFornitore:*'):
        ctx = {}
        ctx['msg'] = 'Non hai i permessi per aprire questa pagina.'
        return render(request, 'anagrafiche/msg.html', ctx)

    ## http://stackoverflow.com/a/27405896/529323
    output = io.BytesIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    sheet = workbook.add_worksheet()
    sheet.set_paper(9)  # A4
    #sheet.set_margins(0.24, 0.24, 0.47, 0.11)

    # larghezza colonne
    sheet.set_column('A:A', 5)
    sheet.set_column('B:B', 12)
    sheet.set_column('C:C', 6)
    sheet.set_column('D:D', 4)
    sheet.set_column('E:E', 9)
    sheet.set_column('F:F', 10)
    sheet.set_column('G:G', 4)
    sheet.set_column('H:H', 4)
    sheet.set_column('I:I', 11)
    sheet.set_column('J:J', 4)
    sheet.set_column('K:K', 11)

    stili = crea_stili(workbook)

    sheet.merge_range('A1:K1', 'CONFERMA ORDINE FORNITORE', stili['bold-centrato-bg_gray'])

    logo_params =  {
        'x_scale': 0.40,
        'y_scale': 0.65,
    }
    sheet.insert_image("A3", "{}anagrafiche/static/img/mrFerro.jpg".format(settings.XLS_IMAGE_PATH), 
        logo_params)

    sheet.merge_range('F3:K3', get_ragione_sociale(ordine.data), stili['bold'])
    sheet.merge_range('F4:K4', get_indirizzo_proprietario())
    #sheet.merge_range('F5:K5', 'Sede operativa: via Lago d\'Iseo, 5 - 24060 Bolgare (BG)')
    sheet.merge_range('F5:K5', 'Tel. e Fax 035.4499168')
    sheet.merge_range('F6:K6', 'E-mail: [email protected] / [email protected]')
    sheet.merge_range('F7:K7', 'Reg. Imp. BG - C.F. E P.IVA 03362370169')

    #sheet.merge_range('A10:B10', 'ORDINE', stili['bold-centrato-bg_gray'])
    #sheet.merge_range('D10:G10', 'CLIENTE', stili['bold-centrato-bg_gray'])

    dati_fornitore = get_dati_entita(ordine.fornitore)    
    
    riga = 8
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Ditta', stili['italic-bg_gray'])
    #sheet.merge_range('B10:C10', dati_fornitore['nome_completo'], stili['boxed'])
    sheet.merge_range(riga, 1, riga, 2, dati_fornitore['nome_completo'], stili['boxed'])
    sheet.write(riga, 3, 'Tel.', stili['italic-bg_gray'])
    sheet.merge_range(riga, 4, riga, 5, dati_fornitore['numero_telefono'], stili['boxed'])
    sheet.merge_range(riga, 6, riga, 7, 'Ordine', stili['italic-bg_gray-no_wrap'])
    sheet.merge_range(riga, 8, riga, 10, ordine.codice, stili['boxed'])

    riga += 1
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Via e N°', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, dati_fornitore['via'], stili['boxed'])
    sheet.write(riga, 3, 'Fax', stili['italic-bg_gray'])
    sheet.merge_range(riga, 4, riga, 5, dati_fornitore['numero_fax'], stili['boxed'])
    sheet.merge_range(riga, 6, riga, 7, 'Data', stili['italic-bg_gray'])
    sheet.merge_range(riga, 8, riga, 10, ordine.data, stili['date-left'])
    
    riga += 1
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Città', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, dati_fornitore['citta_e_pr'], stili['boxed'])
    sheet.write(riga, 3, 'Cant.', stili['italic-bg_gray-no_wrap'])
    sheet.merge_range(riga, 4, riga, 5, ordine.destinazione.get_indirizzo_corto(), stili['boxed'])
    sheet.merge_range(riga, 6, riga+1, 7, 'Ns. commessa', stili['italic-bg_gray-medium'])
    sheet.merge_range(riga, 8, riga+1, 10, ordine.commessa.codice, stili['boxed'])
    
    riga += 1
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Alla \nC. A.', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, ordine.persona_di_riferimento, stili['boxed'])
    sheet.write(riga, 3, 'Mail', stili['italic-bg_gray'])
    sheet.merge_range(riga, 4, riga, 5, dati_fornitore['email'], stili['boxed'])
    #sheet.merge_range('G13:J13', '', stili['border-bottom-right'])
    
    riga += 1
    sheet.write(riga, 0, 'Inserire il codice della nostra commessa su tutta la Vs. documentazione (Ddt, fatture, ecc.).', stili['small'])

    riga += 2
    sheet.set_row(riga, 30)
    sheet.merge_range(riga, 0, riga, 5, 'DESCRIZIONE', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 6, 'UM', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 7, 'QTA', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 8, 'PREZZO UNITARIO', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 9, 'SC %', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 10, 'IMPORTO', stili['bold-centrato-bg_gray'])

    righe = ordine.righe.all().filter(cancellato=False)
    riga +=1
    for rg in righe:
        # la lunghezza della descrizione può arrivare a 1000 caratteri. Cerco di prevedere 
        # quando deve essere alta la riga contando i caratteri della descrizione:
        altezza_riga = get_altezza_cella(rg.articolo_descrizione)
        sheet.set_row(riga, altezza_riga)
        sheet.merge_range(riga, 0, riga, 5, rg.articolo_descrizione, stili['cella-riga'])
        sheet.write(riga, 6, rg.get_articolo_unita_di_misura_display(), stili['cella-riga'])

        # se il prezzo ha 3, 4 o 5 cifre decimali allora usa un carattere più piccolo:
        if (rg.articolo_prezzo*100) - int(rg.articolo_prezzo*100) > 0:
            stile_quantita = 'cella-riga-8'
            stile_prezzo_unitario = 'cella-riga-soldi-8'
        else:
            stile_quantita = 'cella-riga'
            stile_prezzo_unitario = 'cella-riga-soldi'

        sheet.write(riga, 7, rg.quantita, stili[stile_quantita])
        sheet.write(riga, 8, rg.articolo_prezzo, stili[stile_prezzo_unitario])
        if rg.sconto_percentuale:
            sheet.write(riga, 9, rg.sconto_percentuale, stili['boxed-2decimali'])
        else:
            sheet.write(riga, 9, '', stili['boxed'])
        sheet.write(riga, 10, rg.articolo_prezzo * rg.quantita * (1-rg.sconto_percentuale/100), 
            stili['cella-riga-soldi'])
        riga += 1

    #box(workbook, sheet, 15, 0, riga, 9)
    if ordine.totale_su_stampa:
        if ordine.sconto_euro > 0:
            sheet.write(riga, 8, 'Totale righe', stili['boxed'])
            sheet.write(riga, 9, '', stili['boxed'])
            sheet.write(riga, 10, ordine.totale, stili['boxed-soldi'])
            riga += 1
            sheet.write(riga, 8, 'Sconto', stili['boxed'])
            sheet.write(riga, 9, '', stili['boxed'])
            sheet.write(riga, 10, ordine.sconto_euro, stili['boxed-soldi'])
            riga += 1
            sheet.write(riga, 8, 'TOTALE', stili['boxed-bold'])
            sheet.write(riga, 9, '', stili['boxed'])
            sheet.write(riga, 10, ordine.totale - ordine.sconto_euro, stili['boxed-soldi-bold'])

        elif ordine.sconto_percentuale > 0:
            sheet.write(riga, 8, 'Totale righe', stili['boxed'])
            sheet.write(riga, 9, '', stili['boxed'])
            sheet.write(riga, 10, ordine.totale, stili['boxed-soldi'])
            riga += 1
            sheet.write(riga, 8, 'Sconto', stili['boxed'])
            sheet.write(riga, 9, '', stili['boxed'])
            sheet.write(riga, 10, ordine.sconto_percentuale/100, stili['boxed-percentuale'])
            riga += 1
            sheet.write(riga, 8, 'TOTALE', stili['boxed-bold'])
            sheet.write(riga, 9, '', stili['boxed'])
            sheet.write(riga, 10, ordine.totale - (ordine.sconto_percentuale * ordine.totale / 100), 
             stili['boxed-soldi-bold'])
        else:
            sheet.write(riga, 8, 'TOTALE', stili['boxed-bold'])
            sheet.write(riga, 9, '', stili['boxed'])
            sheet.write(riga, 10, ordine.totale, stili['boxed-soldi-bold'])
    else:
        riga -= 1

    riga += 2
    """
    sheet.write(riga, 0, 'Il presente preventivo ha validità un mese dalla data di emissione', stili['bold_small'])
    riga += 1
    """
    sheet.write(riga, 0, 'I prezzi si intendono I.V.A. esclusa - Prezzi F.Co Ns. magazzino', stili['small'])
    riga += 1
    sheet.set_row(riga, 28)
    sheet.merge_range(riga, 0, riga, 10, 'DOCUMENTI RICHIESTI - si chiede di inviare sempre le dichiarazioni di conformità ' +
        ' dei materiali richiesti - Tutti i prodotti devono recare la marcatura CE ai sensi del DPR 246/93 ' +
        'e al D.M. 14/01/2008.', stili['testo-a-capo_small'])    

    riga += 1
    sheet.merge_range(riga, 0, riga, 10, 'CONDIZIONI DI PAGAMENTO', stili['bold-centrato-bg_gray_small'])
    riga += 1
    sheet.merge_range(riga, 0, riga, 10, ordine.pagamento.descrizione, stili['boxed_small'])

    """
    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'DOCUMENTAZIONE PROGETTUALE', stili['bold-centrato-bg_gray_small'])
    riga += 1
    if ordine.disegni_costruttivi:
        disegni_costruttivi = 'Disegni costruttivi a carico del cliente: sì'
    else:
        disegni_costruttivi = 'Disegni costruttivi a carico del cliente: no'
    sheet.merge_range(riga, 0, riga, 4, disegni_costruttivi, stili['boxed_small'])
    if ordine.relazione_di_calcolo:
        relazione_di_calcolo = 'Relazione di calcolo a carico del cliente: sì'
    else:
        relazione_di_calcolo = 'Relazione di calcolo a carico del cliente: no'
    sheet.merge_range(riga, 5, riga, 9, relazione_di_calcolo, stili['boxed_small'])

    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'CARATTERISTICHE PRODOTTO/LAVORAZIONE', stili['bold-centrato-bg_gray_small'])
    riga += 1
    sheet.merge_range(riga, 0, riga, 2, "Tipo di acciaio: {}".format(ordine.tipo_di_acciaio), stili['boxed_small'])
    sheet.merge_range(riga, 3, riga, 5, "Spessori: {}".format(ordine.spessori), stili['boxed_small'])
    sheet.merge_range(riga, 6, riga, 9, "Zincatura: {}".format(ordine.zincatura), stili['boxed_small'])
    riga += 1
    sheet.merge_range(riga, 0, riga, 2, "Classe di esecuzione: {}".format(ordine.classe_di_esecuzione), stili['boxed_small'])
    sheet.merge_range(riga, 3, riga, 5, "WPS: {}".format(ordine.wps), stili['boxed_small'])
    sheet.merge_range(riga, 6, riga, 9, "Verniciatura: {}".format(ordine.verniciatura), stili['boxed_small'])
    riga += 1
    sheet.set_row(riga, 22)
    sheet.merge_range(riga, 0, riga, 9, 'Qualora il cliente/progettista non espliciti la Classe di Esecuzione dei prodotti, {} applica la Classe di Esecuzione EXC 2 come previsto dalla norma EN 1090-1.'.format(ordine.data),
        stili['testo-a-capo-boxed_small'])
    """
    if ordine.note: 
        riga += 1
        sheet.merge_range(riga, 0, riga, 10, 'NOTE', stili['bold-centrato-bg_gray_small'])
        riga += 1
        sheet.merge_range(riga, 0, riga, 10, ordine.note, stili['testo-a-capo-boxed_small'])

    riga += 1
    """
    sheet.merge_range(riga, 0, riga, 9, 'CONDIZIONI GENERALI DI FORNITURA', stili['bold-centrato-bg_gray_small'])
    riga += 1
    sheet.set_row(riga, 22)
    sheet.merge_range(riga, 0, riga, 9, 'Per tutto quanto non espressamente indicato nel presente preventivo si fa riferimento alle condizioni generali di fornitura M72-01-02.',
        stili['testo-a-capo-boxed_small'])
    """
    riga += 1
    sheet.set_row(riga, 22)
    sheet.merge_range(riga, 0, riga, 10, 'Vi preghiamo di voler sottoscrivere per accettazione il presente ordine, indicando banca d\'appoggio.',
        stili['testo-a-capo_small'])
    """
    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'Così facendo ci permette di eseguire tempestivamente i lavori confermati.', stili['small'])
    """
    riga += 2
    sheet.merge_range(riga, 4, riga, 5, 'Firma per accettazione', stili['testo-centrato_small'])
    sheet.merge_range(riga, 7, riga, 10, 'Il Responsabile tecnico', stili['testo-centrato_small'])

    riga += 1
    sheet.set_row(riga, 10)

    riga += 1
    data_str = ordine.data.strftime("%d/%m/%y")
    sheet.merge_range(riga, 0, riga, 2, 'Bolgare (Bg), lì {}'.format(data_str), stili['small'] )
    sheet.merge_range(riga, 4, riga, 5, '______________________________', stili['testo-centrato_small'])
    sheet.merge_range(riga, 7, riga, 10, '______________________________', stili['testo-centrato_small'])

    footer1 = '&L&7Documento realizzato con un programma dello Studio Gamma Snc.\nwww.studiogammasnc.it&R&7Pagina &P' \
              + ' di &N\n'
    sheet.set_footer(footer1)

    workbook.close()
    output.seek(0)
    response = HttpResponse(output.read(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    response['Content-Disposition'] = "attachment; filename=ordine " + ordine.codice + ".xlsx"
    return response
Пример #5
0
def crea_xls_preventivo_fornitore(request, id_preventivo):

    preventivo = get_object_or_404(PreventivoFornitore, pk=id_preventivo)

    u = request.user 
    if not u.has_perm('anagrafiche._preventivoFornitore:*'):
        ctx = {}
        ctx['msg'] = 'Non hai i permessi per aprire questa pagina.'
        return render(request, 'anagrafiche/msg.html', ctx)

    # http://stackoverflow.com/a/27405896/529323
    output = io.BytesIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    sheet = workbook.add_worksheet()
    sheet.set_paper(9)  # A4
    # sheet.set_margins(0.24, 0.24, 0.47, 0.11)

    # larghezza colonne
    """
    sheet.set_column('A:A', 12) #1.24
    sheet.set_column('B:B', 13) #1.33
    sheet.set_column('C:C', 14) #1.43
    sheet.set_column('D:D', 15) #1.53
    sheet.set_column('E:E', 16) #1.63   
    sheet.set_column('F:F', 17) #1.72
    sheet.set_column('G:G', 18) #1.82
    sheet.set_column('A:A', 19) #1.92
    sheet.set_column('B:B', 20) #2.01
    """
    sheet.set_column('A:A', 5)
    sheet.set_column('B:B', 12)
    sheet.set_column('C:C', 7)
    sheet.set_column('D:D', 4)
    sheet.set_column('E:E', 9)
    sheet.set_column('F:F', 13)
    sheet.set_column('G:G', 4)
    sheet.set_column('H:H', 4)
    sheet.set_column('I:I', 11)
    sheet.set_column('J:J', 11)

    stili = crea_stili(workbook)

    sheet.merge_range('A1:J1', 'RICHIESTA PREVENTIVO FORNITORE', stili['bold-centrato-bg_gray'])

    logo_params =  {
        'x_scale': 0.40,
        'y_scale': 0.65,
    }
    sheet.insert_image("A3", "{}anagrafiche/static/img/mrFerro.jpg".format(settings.XLS_IMAGE_PATH), 
        logo_params)

    sheet.merge_range('F3:J3', get_ragione_sociale(preventivo.data), stili['bold'])
    sheet.merge_range('F4:J4', get_indirizzo_proprietario())
    # sheet.merge_range('F5:J5', 'Sede operativa: via Lago d\'Iseo, 5 - 24060 Bolgare (BG)')
    sheet.merge_range('F5:J5', 'Tel. e Fax 035.4499168')
    sheet.merge_range('F6:J6', 'E-mail: [email protected] / [email protected]')
    sheet.merge_range('F7:J7', 'Reg. Imp. BG - C.F. E P.IVA 03362370169')

    # sheet.merge_range('A10:B10', 'ORDINE', stili['bold-centrato-bg_gray'])
    # sheet.merge_range('D10:G10', 'CLIENTE', stili['bold-centrato-bg_gray'])

    dati_fornitori = get_dati_entita(preventivo.fornitore)    

    riga = 8
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Ditta', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, dati_fornitori['nome_completo'], stili['boxed'])
    sheet.write(riga, 3, 'Tel.', stili['italic-bg_gray'])
    sheet.merge_range(riga, 4, riga, 5, dati_fornitori['numero_telefono'], stili['boxed'])
    sheet.merge_range(riga, 6, riga, 7, 'Preventivo', stili['italic-bg_gray-no_wrap'])
    sheet.merge_range(riga, 8, riga, 9, preventivo.codice, stili['boxed'])
    
    riga += 1
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Via e N°', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, dati_fornitori['via'], stili['boxed'])
    sheet.write(riga, 3, 'Fax', stili['italic-bg_gray'])
    sheet.merge_range(riga, 4, riga, 5, dati_fornitori['numero_fax'], stili['boxed'])
    sheet.merge_range(riga, 6, riga, 7, 'Data', stili['italic-bg_gray'])
    sheet.merge_range(riga, 8, riga, 9, preventivo.data, stili['date-left'])
    
    riga += 1
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Città', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, dati_fornitori['citta_e_pr'], stili['boxed'])
    sheet.write(riga, 3, 'Cant.', stili['italic-bg_gray-no_wrap'])
    sheet.merge_range(riga, 4, riga, 5, preventivo.destinazione.get_indirizzo_corto(), stili['boxed'])
    sheet.merge_range(riga, 6, riga+1, 7, 'Ns. Commessa', stili['italic-bg_gray-medium'])
    # i preventivi possono avere commessa nulla; forse sarebbe meglio rendere il campo obbligatorio
    # ma per ora uso questo workaround:
    codice_commessa = preventivo.commessa.codice if preventivo.commessa else ''
    sheet.merge_range(riga, 8, riga+1, 9, codice_commessa, stili['boxed'])
    
    riga += 1
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Alla \nC. A.', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, preventivo.persona_di_riferimento, stili['boxed'])
    sheet.write(riga, 3, 'Mail', stili['italic-bg_gray'])
    sheet.merge_range(riga, 4, riga, 5, dati_fornitori['email'], stili['boxed'])
    # sheet.merge_range('G13:J13', '', stili['border-bottom-right'])
    
    riga += 1
    sheet.write(riga, 0,
                'Inserire il codice della nostra commessa su tutta la Vs. documentazione (Ddt, fatture, ecc.).',
                stili['small'])

    riga +=2
    sheet.set_row(riga, 30)
    sheet.merge_range(riga, 0, riga, 5, 'DESCRIZIONE', stili['bold-centrato-bg_gray'])
    sheet.merge_range(riga, 6, riga, 7, 'U. M.', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 8, 'QUANTITÀ', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 9, 'CONSEGNA', stili['bold-centrato-bg_gray'])

    righe = preventivo.righe.all().filter(cancellato=False)
    riga +=1
    for r in righe:
        # la lunghezza della descrizione può arrivare a 1000 caratteri. Cerco di prevedere 
        # quando deve essere alta la riga contando i caratteri della descrizione:
        altezza_riga = get_altezza_cella(r.articolo_descrizione)
        sheet.set_row(riga, altezza_riga)
        sheet.merge_range(riga, 0, riga, 5, r.articolo_descrizione, stili['cella-riga'])
        sheet.merge_range(riga, 6, riga, 7, r.get_articolo_unita_di_misura_display(), stili['cella-riga'])
        # sheet.write(riga, 0, r.articolo_descrizione, stili['cella-riga'])
        sheet.write(riga, 8, r.quantita, stili['cella-riga'])
        sheet.write(riga, 9, r.data_consegna, stili['cella-riga-data'])
        riga += 1

    riga += 2
    sheet.write(riga, 0, 'I prezzi si intendono I.V.A. esclusa - Prezzi F.Co Ns. magazzino.', stili['small'])
    # Issue sulla certificazione ferro è in sospeso:
    # riga += 1
    # sheet.write(riga, 0, 'Tutto il ferro fornito deve essere certificato 3.1.', stili['small'])
    riga += 1
    sheet.set_row(riga, 28)
    sheet.merge_range(riga, 0, riga, 9, 'DOCUMENTI RICHIESTI - si chiede di inviare sempre le dichiarazioni di ' +
                      'conformità dei materiali richiesti - Tutti i prodotti devono recare la marcatura CE ai sensi ' +
                      'del DPR 246/93 e al D.M. 14/01/2008.', stili['testo-a-capo_small'])

    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'CONDIZIONI DI PAGAMENTO', stili['bold-centrato-bg_gray_small'])
    riga += 1
    sheet.merge_range(riga, 0, riga, 9, preventivo.pagamento.descrizione, stili['boxed_small'])

    if preventivo.note: 
        riga += 1
        sheet.merge_range(riga, 0, riga, 9, 'NOTE', stili['bold-centrato-bg_gray_small'])
        riga += 1
        sheet.merge_range(riga, 0, riga, 9, preventivo.note, stili['testo-a-capo-boxed_small'])

    """
    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'CONDIZIONI GENERALI DI FORNITURA', stili['bold-centrato-bg_gray_small'])
    riga += 1
    sheet.set_row(riga, 22)
    sheet.merge_range(riga, 0, riga, 9, 'Per tutto quanto non espressamente indicato nel presente preventivo si fa '
    + ' riferimento alle condizioni generali di fornitura M72-01-02.',
        stili['testo-a-capo-boxed_small'])
    """

    riga += 1
    sheet.set_row(riga, 22)
    sheet.merge_range(riga, 0, riga, 9, 'Vi preghiamo di inviarci preventivo per i seguenti articoli.',
                      stili['testo-a-capo_small'])
    """
    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'Così facendo ci permette di eseguire tempestivamente i lavori confermati.',
    stili['small'])
    """

    riga += 2
    sheet.merge_range(riga, 4, riga, 5, 'Firma per accettazione', stili['testo-centrato_small'])
    sheet.merge_range(riga, 7, riga, 9, 'Il Responsabile tecnico', stili['testo-centrato_small'])

    riga += 1
    sheet.set_row(riga, 10)

    riga += 1
    data_str = preventivo.data.strftime("%d/%m/%y")
    sheet.merge_range(riga, 0, riga, 2, 'Bolgare (Bg), lì {}'.format(data_str), stili['small'] )
    sheet.merge_range(riga, 4, riga, 5, '______________________________', stili['testo-centrato_small'])
    sheet.merge_range(riga, 7, riga, 9, '______________________________', stili['testo-centrato_small'])

    footer1 = '&L&7Documento realizzato con un programma dello Studio Gamma Snc.\nwww.studiogammasnc.it&R&7Pagina &P' \
              + ' di &N\n'
    sheet.set_footer(footer1)

    workbook.close()
    output.seek(0)
    response = HttpResponse(output.read(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    response['Content-Disposition'] = "attachment; filename=preventivo " + preventivo.codice + ".xlsx"
    return response
Пример #6
0
def crea_xls_preventivo_cliente(request, id_preventivo):

    preventivo = get_object_or_404(PreventivoCliente, pk=id_preventivo)

    u = request.user 
    if not u.has_perm('anagrafiche._preventivoCliente:*'):
        ctx = {}
        ctx['msg'] = 'Non hai i permessi per aprire questa pagina.'
        return render(request, 'anagrafiche/msg.html', ctx)

    # http://stackoverflow.com/a/27405896/529323
    output = io.BytesIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    sheet = workbook.add_worksheet()
    sheet.set_paper(9)  # A4
    # sheet.set_margins(0.24, 0.24, 0.47, 0.11)

    # larghezza colonne
    """
    sheet.set_column('A:A', 12) #1.24
    sheet.set_column('B:B', 13) #1.33
    sheet.set_column('C:C', 14) #1.43
    sheet.set_column('D:D', 15) #1.53
    sheet.set_column('E:E', 16) #1.63   
    sheet.set_column('F:F', 17) #1.72
    sheet.set_column('G:G', 18) #1.82
    sheet.set_column('A:A', 19) #1.92
    sheet.set_column('B:B', 20) #2.01
    """
    sheet.set_column('A:A', 5)
    sheet.set_column('B:B', 12)
    sheet.set_column('C:C', 7)
    sheet.set_column('D:D', 4)
    sheet.set_column('E:E', 9)
    sheet.set_column('F:F', 13)
    sheet.set_column('G:G', 4)
    sheet.set_column('H:H', 4)
    sheet.set_column('I:I', 11)
    sheet.set_column('J:J', 11)

    stili = crea_stili(workbook)

    sheet.merge_range('A1:J1', 'PREVENTIVO', stili['bold-centrato-bg_gray'])

    logo_params =  {
        'x_scale': 0.40,
        'y_scale': 0.65,
    }
    sheet.insert_image("A3", "{}anagrafiche/static/img/mrFerro.jpg".format(settings.XLS_IMAGE_PATH), 
        logo_params)

    sheet.merge_range('F3:J3', get_ragione_sociale(preventivo.data), stili['bold'])
    sheet.merge_range('F4:J4', get_indirizzo_proprietario())
    # sheet.merge_range('F5:J5', '')
    sheet.merge_range('F5:J5', 'Tel. e Fax 035.4499168')
    sheet.merge_range('F6:J6', 'E-mail: [email protected] / [email protected]')
    sheet.merge_range('F7:J7', 'Reg. Imp. BG - C.F. E P.IVA 03362370169')

    # sheet.merge_range('A10:B10', 'ORDINE', stili['bold-centrato-bg_gray'])
    # sheet.merge_range('D10:G10', 'CLIENTE', stili['bold-centrato-bg_gray'])

    dati_cliente = get_dati_entita(preventivo.cliente)    
    
    riga = 8
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Ditta', stili['italic-bg_gray'])
    # sheet.merge_range('B10:C10', dati_cliente['nome_completo'], stili['boxed'])
    sheet.merge_range(riga, 1, riga, 2, dati_cliente['nome_completo'], stili['boxed'])
    sheet.write(riga, 3, 'Tel.', stili['italic-bg_gray'])
    sheet.merge_range(riga, 4, riga, 5, dati_cliente['numero_telefono'], stili['boxed'])
    sheet.merge_range(riga, 6, riga, 7, 'Preventivo', stili['italic-bg_gray-no_wrap'])
    sheet.merge_range(riga, 8, riga, 9, preventivo.codice, stili['boxed'])

    riga += 1
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Via e N°', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, dati_cliente['via'], stili['boxed'])
    sheet.write(riga, 3, 'Fax', stili['italic-bg_gray'])
    sheet.merge_range(riga, 4, riga, 5, dati_cliente['numero_fax'], stili['boxed'])
    sheet.merge_range(riga, 6, riga, 7, 'Data', stili['italic-bg_gray'])
    sheet.merge_range(riga, 8, riga, 9, preventivo.data, stili['date-left'])
    
    riga += 1
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Città', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, dati_cliente['citta_e_pr'], stili['boxed'])
    sheet.write(riga, 3, 'Cant.', stili['italic-bg_gray-no_wrap'])
    sheet.merge_range(riga, 4, riga, 5, preventivo.destinazione.get_indirizzo_corto(), stili['boxed'])
    sheet.merge_range(riga, 6, riga+1, 7, 'Oggetto', stili['italic-bg_gray'])
    sheet.merge_range(riga, 8, riga+1, 9, preventivo.oggetto, stili['boxed'])
    
    riga += 1
    sheet.set_row(riga, 30)
    sheet.write(riga, 0, 'Alla \nC. A.', stili['italic-bg_gray'])
    sheet.merge_range(riga, 1, riga, 2, preventivo.persona_di_riferimento, stili['boxed'])
    sheet.write(riga, 3, 'Mail', stili['italic-bg_gray'])
    sheet.merge_range(riga, 4, riga, 5, dati_cliente['email'], stili['boxed'])
    # sheet.merge_range('G13:J13', '', stili['border-bottom-right'])

    riga += 2
    sheet.set_row(riga, 30)
    sheet.merge_range(riga, 0, riga, 5, 'DESCRIZIONE', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 6, 'UM', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 7, 'QTA', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 8, 'PREZZO UNITARIO', stili['bold-centrato-bg_gray'])
    sheet.write(riga, 9, 'IMPORTO', stili['bold-centrato-bg_gray'])

    righe = preventivo.righe.all().filter(cancellato=False)
    riga +=1
    for r in righe:
        # la lunghezza della descrizione può arrivare a 1000 caratteri. Cerco di prevedere 
        # quando deve essere alta la riga contando i caratteri della descrizione:
        altezza_riga = get_altezza_cella(r.articolo_descrizione)
        sheet.set_row(riga, altezza_riga)
        sheet.merge_range(riga, 0, riga, 5, r.articolo_descrizione, stili['cella-riga'])
        # sheet.write(riga, 0, r.articolo_descrizione, stili['cella-riga'])
        sheet.write(riga, 6, r.get_articolo_unita_di_misura_display(), stili['cella-riga'])
        sheet.write(riga, 7, r.quantita, stili['cella-riga'])
        sheet.write(riga, 8, r.articolo_prezzo, stili['cella-riga-soldi'])
        sheet.write(riga, 9, r.totale, stili['cella-riga-soldi'])
        riga += 1

    # box(workbook, sheet, 15, 0, riga, 9)
    if preventivo.totale_su_stampa:
        sheet.write(riga, 8, 'TOTALE', stili['boxed-bold'])
        sheet.write(riga, 9, preventivo.totale, stili['boxed-soldi-bold'])
    else:
        riga -= 1

    riga += 2
    sheet.write(riga, 0, 'Il presente preventivo ha validità un mese dalla data di emissione', stili['bold_small'])
    riga += 1
    sheet.write(riga, 0, 'I prezzi si intendono I.V.A. esclusa - Prezzi F.Co Ns. magazzino', stili['small'])

    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'CONDIZIONI DI PAGAMENTO', stili['bold-centrato-bg_gray_small'])
    riga += 1
    sheet.merge_range(riga, 0, riga, 9, preventivo.pagamento.descrizione, stili['boxed_small'])

    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'DOCUMENTAZIONE PROGETTUALE', stili['bold-centrato-bg_gray_small'])
    riga += 1
    if preventivo.disegni_costruttivi:
        disegni_costruttivi = 'Disegni costruttivi a carico del cliente: sì'
    else:
        disegni_costruttivi = 'Disegni costruttivi a carico del cliente: no'
    sheet.merge_range(riga, 0, riga, 4, disegni_costruttivi, stili['boxed_small'])
    if preventivo.relazione_di_calcolo:
        relazione_di_calcolo = 'Relazione di calcolo a carico del cliente: sì'
    else:
        relazione_di_calcolo = 'Relazione di calcolo a carico del cliente: no'
    sheet.merge_range(riga, 5, riga, 9, relazione_di_calcolo, stili['boxed_small'])

    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'CARATTERISTICHE PRODOTTO/LAVORAZIONE', stili['bold-centrato-bg_gray_small'])
    riga += 1
    sheet.merge_range(riga, 0, riga, 2, "Tipo di acciaio: {}".format(preventivo.tipo_di_acciaio), stili['boxed_small'])
    sheet.merge_range(riga, 3, riga, 5, "Spessori: {}".format(preventivo.spessori), stili['boxed_small'])
    sheet.merge_range(riga, 6, riga, 9, "Zincatura: {}".format(preventivo.zincatura), stili['boxed_small'])
    riga += 1
    sheet.merge_range(riga, 0, riga, 2, "Classe di esecuzione: {}".format(preventivo.classe_di_esecuzione),
                      stili['boxed_small'])
    sheet.merge_range(riga, 3, riga, 5, "WPS: {}".format(preventivo.wps), stili['boxed_small'])
    sheet.merge_range(riga, 6, riga, 9, "Verniciatura: {}".format(preventivo.verniciatura), stili['boxed_small'])
    riga += 1
    sheet.set_row(riga, 22)
    sheet.merge_range(riga, 0, riga, 9, ('Qualora il cliente/progettista non espliciti la Classe di Esecuzione dei ' +
                      'prodotti, {} applica la Classe di Esecuzione EXC 2 come previsto dalla norma EN 1090-1.')
                      .format(get_ragione_sociale(preventivo.data)), stili['testo-a-capo-boxed_small'])

    if preventivo.note: 
        riga += 1
        sheet.merge_range(riga, 0, riga, 9, 'NOTE', stili['bold-centrato-bg_gray_small'])
        riga += 1
        sheet.merge_range(riga, 0, riga, 9, preventivo.note, stili['testo-a-capo-boxed_small'])

    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'CONDIZIONI GENERALI DI FORNITURA', stili['bold-centrato-bg_gray_small'])
    riga += 1
    """
    sheet.set_row(riga, 22)
    sheet.merge_range(riga, 0, riga, 9, 'Per tutto quanto non espressamente indicato nel presente preventivo si fa
    riferimento alle condizioni generali di fornitura M72-01-02.',
        stili['testo-a-capo-boxed_small'])
    """
    sheet.set_row(riga, 36)
    sheet.merge_range(riga, 0, riga, 9, 'Eventuali certificazioni e/o dichiarazioni dovranno essere richieste in fase' +
                      ' di preventivo e verranno rilasciate solo a completo pagamento della fattura finale.\nPer ' +
                      'tutto quanto non espressamente indicato nel presente preventivo si fa riferimento alle ' +
                      'condizioni generali di fornitura M72-01-02.',
        stili['testo-a-capo-boxed_small'])

    riga += 1
    sheet.set_row(riga, 22)
    sheet.merge_range(riga, 0, riga, 9, 'Vi preghiamo di voler sottoscrivere per accettazione il presente preventivo, '
                      + 'indicando Vs. ragione sociale corretta e, se necessario, banca d\'appoggio.',
        stili['testo-a-capo_small'])
    riga += 1
    sheet.merge_range(riga, 0, riga, 9, 'Così facendo ci permette di eseguire tempestivamente i lavori confermati.',
                      stili['small'])

    riga += 1
    sheet.merge_range(riga, 4, riga, 5, 'Firma per accettazione', stili['testo-centrato_small'])
    sheet.merge_range(riga, 7, riga, 9, 'Il Responsabile tecnico', stili['testo-centrato_small'])

    riga += 1
    sheet.set_row(riga, 10)

    riga += 1
    data_str = preventivo.data.strftime("%d/%m/%y")
    sheet.merge_range(riga, 0, riga, 2, 'Bolgare (Bg), lì {}'.format(data_str), stili['small'] )
    sheet.merge_range(riga, 4, riga, 5, '______________________________', stili['testo-centrato_small'])
    sheet.merge_range(riga, 7, riga, 9, '______________________________', stili['testo-centrato_small'])

    footer1 = '&L&7Documento realizzato con un programma dello Studio Gamma Snc.\nwww.studiogammasnc.it&R&7Pagina &P' \
              + ' di &N\n'
    # footer1 = '&"Tahoma,Bold"&4&Kff0000Hello, World!'
    sheet.set_footer(footer1)

    workbook.close()
    output.seek(0)
    response = HttpResponse(output.read(),
                            content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    response['Content-Disposition'] = "attachment; filename=preventivo " + preventivo.codice + ".xlsx"
    return response
Пример #7
0
def crea_xls_consuntivi(request):
    def scriviCliente(cliente):
        crea_xls_consuntivi.riga += 1
        sheet.set_row(crea_xls_consuntivi.riga, 25)  # altezza riga
        nome_cliente = ""
        if cliente.is_owner:
            nome_cliente = "COMMESSE INTERNE"
        else:
            nome_cliente = "{} {}".format(cliente.codice,
                                          cliente.get_nome_completo())

        sheet.write(crea_xls_consuntivi.riga, 0, nome_cliente,
                    stili['bold-15'])
        crea_xls_consuntivi.riga += 1

    def scriviCommessa(commessa):
        crea_xls_consuntivi.riga += 1
        sheet.write(
            crea_xls_consuntivi.riga, 0, "Commessa {} - aperta il {}".format(
                commessa.codice,
                datetime.strftime(commessa.data_apertura, "%d/%m/%Y")),
            stili['bold-10'])
        crea_xls_consuntivi.riga += 1
        sheet.write(crea_xls_consuntivi.riga, 0, commessa.prodotto,
                    stili['10'])
        crea_xls_consuntivi.riga += 2

    def scriviIntestazioneTabella():
        sheet.write(crea_xls_consuntivi.riga, 0, 'Data',
                    stili['bold-centrato-bg_gray-10'])
        sheet.write(crea_xls_consuntivi.riga, 1, 'Dipendente',
                    stili['bold-centrato-bg_gray-10'])
        sheet.write(crea_xls_consuntivi.riga, 2, 'Tipo lavoro',
                    stili['bold-centrato-bg_gray-10'])
        sheet.write(crea_xls_consuntivi.riga, 3, 'Ore',
                    stili['bold-centrato-bg_gray-10'])
        sheet.write(crea_xls_consuntivi.riga, 4, 'Note',
                    stili['bold-centrato-bg_gray-10'])
        crea_xls_consuntivi.riga += 1

    def scriviRigaTabella(con):
        sheet.set_row(crea_xls_consuntivi.riga, 30)  # altezza riga
        sheet.write(crea_xls_consuntivi.riga, 0,
                    datetime.strftime(con.data, FORMATO_DATA_ITALIANO_CORTO),
                    stili['boxed-10'])
        sheet.write(crea_xls_consuntivi.riga, 1,
                    con.dipendente.getNomeCompleto(), stili['boxed-10'])
        sheet.write(crea_xls_consuntivi.riga, 2, con.tipo_lavoro.descrizione,
                    stili['boxed-10'])
        sheet.write(crea_xls_consuntivi.riga, 3, con.ore, stili['boxed-10'])
        sheet.write(crea_xls_consuntivi.riga, 4, con.note, stili['boxed-10'])
        #  sheet.write(crea_xls_consuntivi.riga, 5, con.commessa.codice, stili['boxed-10'])
        crea_xls_consuntivi.riga += 1

    def scriviTotale():
        for tipo in tipo_lavori:
            if totali_ore_per_tipo[tipo.id] > 0:
                sheet.set_row(crea_xls_consuntivi.riga, 30)  # altezza riga
                sheet.write(crea_xls_consuntivi.riga, 2,
                            'Totale {}'.format(tipo.descrizione.lower()),
                            stili['wrap-10'])
                sheet.write(crea_xls_consuntivi.riga, 3,
                            totali_ore_per_tipo[tipo.id], stili['wrap-10'])
                crea_xls_consuntivi.riga += 1
            # dopo aver scritto il totale di un tipo lavoro, resettalo per la commessa successiva:
            totali_ore_per_tipo[tipo.id] = 0

        crea_xls_consuntivi.riga += 1
        sheet.write(crea_xls_consuntivi.riga, 2, 'Totale ore',
                    stili['bold-10'])
        sheet.write(crea_xls_consuntivi.riga, 3, totale_ore, stili['bold-10'])
        crea_xls_consuntivi.riga += 2

    def resetta_totali_ore_per_tipo():
        for tipo in tipo_lavori:
            totali_ore_per_tipo[tipo.id] = 0

    ## http://stackoverflow.com/a/27405896/529323
    output = io.BytesIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    sheet = workbook.add_worksheet()
    sheet.set_paper(9)  # A4
    #sheet.set_margins(0.24, 0.24, 0.47, 0.11)

    # larghezza colonne
    sheet.set_column('A:A', 9)
    sheet.set_column('B:B', 16)
    sheet.set_column('C:C', 20)
    sheet.set_column('D:D', 6)
    sheet.set_column('E:E', 32)
    stili = crea_stili(workbook)
    today = datetime.today()
    crea_xls_consuntivi.riga = 0

    u = request.user
    if not u.has_perm('anagrafiche._consuntivo:*'):
        ctx = {}
        ctx['msg'] = 'Non hai i permessi per creare il report dei consuntivi.'
        return render(request, 'anagrafiche/msg.html', ctx)

    data_inizio = None
    data_fine = None
    data_inizio_str = request.GET.get('data_inizio')
    data_fine_str = request.GET.get('data_fine')

    if data_inizio_str:
        try:
            data_inizio = datetime.strptime(data_inizio_str, '%Y-%m-%d').date()
        except:
            data_inizio = None
            #result = result.filter(data__gte=data_da)

    if data_fine_str:
        try:
            data_fine = datetime.strptime(data_fine_str, '%Y-%m-%d').date()
        except:
            data_fine = None

    if not data_inizio and not data_fine:
        ctx = {}
        ctx['msg'] = 'Impossibile creare il report dei consuntivi. Parametri \'data inizio\' e \'data fine\' non validi. Premi il tasto \'indietro\' del browser.'
        return render(request, 'anagrafiche/msg.html', ctx)
    elif not data_inizio:
        ctx = {}
        ctx['msg'] = 'Impossibile creare il report dei consuntivi. Parametro \'data inizio\' non valido. Premi il tasto \'indietro\' del browser.'
        return render(request, 'anagrafiche/msg.html', ctx)
    elif not data_fine:
        ctx = {}
        ctx['msg'] = 'Impossibile creare il report dei consuntivi. Parametro \'data fine\' non valido. Premi il tasto \'indietro\' del browser.'
        return render(request, 'anagrafiche/msg.html', ctx)

    sheet.merge_range(
        crea_xls_consuntivi.riga, 0, crea_xls_consuntivi.riga, 4,
        'REPORT CONSUNTIVI AL {}'.format(
            datetime.strftime(today, FORMATO_DATA_ITALIANO)),
        stili['bold-centrato-bg_gray-10'])
    crea_xls_consuntivi.riga += 1


    consuntivi = Consuntivo.objects.non_cancellati().filter(data__gte=data_inizio, data__lte=data_fine) \
        .order_by('commessa__cliente__codice', 'commessa', 'data', 'dipendente__nome', 'tipo_lavoro__descrizione')

    cliente_attuale = None
    commessa_attuale = None

    totale_ore_gia_scritto = True
    totale_ore = 0
    totali_ore_per_tipo = {}  # crea l'oggetto
    resetta_totali_ore_per_tipo(
    )  # assicurati che ci sia un indice per ogni tipo lavoro

    for con in consuntivi:
        if con.commessa.cliente != cliente_attuale:
            if not totale_ore_gia_scritto:
                scriviTotale()
                totale_ore_gia_scritto = True
            scriviCliente(con.commessa.cliente)

        if con.commessa != commessa_attuale:
            if not totale_ore_gia_scritto:
                scriviTotale()
                totale_ore_gia_scritto = True
            scriviCommessa(con.commessa)
            totale_ore = 0  # resetta il contatore delle ore per ogni commessa.
            resetta_totali_ore_per_tipo()
            scriviIntestazioneTabella()
            totale_ore_gia_scritto = False  # dopo ogni inizio di tabella va scritta anche una fine

        scriviRigaTabella(con)
        totale_ore += con.ore
        totali_ore_per_tipo[con.tipo_lavoro.id] += con.ore
        cliente_attuale = con.commessa.cliente
        commessa_attuale = con.commessa

    # scrivi il totale dell'ultima tabella (senza scrivere nulla nel caso non ci siano consuntivi).
    if not totale_ore_gia_scritto:
        scriviTotale()

    workbook.close()
    output.seek(0)
    response = HttpResponse(
        output.read(),
        content_type=
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    response[
        'Content-Disposition'] = "attachment; filename=consuntivi da " + data_inizio_str + " a " + data_fine_str + ".xlsx"
    return response