def generate_pdf_summary(data: List, yyyy: str, mm: str,
                         pdf_file: str) -> None:
    cols = [30, 150]

    rpt = Report(datasource=data,
                 detailband=Band([
                     Element((cols[0], 0), ("Helvetica", 10), key='name'),
                     Element((cols[1], 0), ("Helvetica", 10), key='hours'),
                 ]))

    rpt.pageheader = Band([
        Element((cols[0], 0), ("Times-Bold", 18), text="Summary"),
        Element((cols[0] + 150, 7), ("Helvetica", 11), text="timesheet"),
        Element((cols[0] + 150 + 52, 0), ("Times-Bold", 18),
                text=f"{yyyy}-{mm}"),
        Element((cols[0], 45), ("Helvetica", 11), text="Name"),
        Element((cols[1], 45), ("Helvetica", 11), text="Hours"),
        Rule((cols[0], 63), 6 * 72, thickness=1),
        Element((cols[0], 67), ("Helvetica", 6), text=" "),
    ])

    print(pdf_file.absolute(), yyyy, mm)
    canvas = Canvas(str(pdf_file.absolute()), pagesize=A4)
    rpt.generate(canvas)
    canvas.save()
Example #2
0
def print_timesheets(period: str, path: str, uids: List = []) -> None:    

    for uid in uids:
        qry = (t.tracking_date.year()==int(period[:4])) &(t.tracking_date.month()==int(period[5:])) &(t.user_id==uid)

        rows = db(qry).select()
        tothours = tot_hours(rows)[:-3]
        data = rows.as_list()

        if False:        
            import sys
            print(tothours)
            sys.exit()

        user = db(u.id==uid).select().first()
        
        pdf_file = os.path.join(path, f"{period[:2]}{period[5:]}-timesheet {user.last_name} {user.first_name}.pdf")

        cols = [30, 130, 170, 210, 250, 310, 350]

        rpt = Report(datasource = data, 
                    detailband = Band([
                        Element((cols[0], 0),  ("Helvetica", 10), key = 'tracking_date', format = lambda x: x.strftime("%Y-%m-%d %a")),
                        Element((cols[1], 0), ("Helvetica", 10), key = 'time_start', format = lambda x: x.strftime("%H:%M")),
                        Element((cols[2], 0), ("Helvetica", 10), key = 'time_end', format = lambda x: x.strftime("%H:%M")),
                        Element((cols[3], 0), ("Helvetica", 10), key = 'time_break', format = lambda x: x.strftime("%H:%M")),
                        Element((cols[4], 0), ("Helvetica-Bold", 10), key = 'total_time', format = lambda x: x[:-3]),
                        Element((cols[5], 0), ("Helvetica", 10), key = 'place'),
                        # Element((cols[6], 0), ("Helvetica", 10), key = 'comments'),
                    ]))

        rpt.pageheader = Band([
            Element((cols[0], 0), ("Times-Bold", 18), text = f"{user.last_name} {user.first_name}"),
            Element((cols[0]+150, 7), ("Helvetica", 11), text = "timesheet"),
            Element((cols[0]+150+52, 0), ("Times-Bold", 18), text = f"{period}"),
            Element((cols[0]+150+52+125, 7), ("Helvetica", 11), text = "total hours: "),
            Element((cols[0]+150+52+125+60, 0), ("Times-Bold", 18), text = f"{tothours}"),

            Element((cols[0], 45), ("Helvetica", 11), text = "Date"),
            Element((cols[1], 45), ("Helvetica", 11), text = "Start"),
            Element((cols[2], 45), ("Helvetica", 11), text = "End"),
            Element((cols[3], 45), ("Helvetica", 11), text = "Break"),
            Element((cols[4], 45), ("Helvetica", 11), text = "Total"),
            Element((cols[5], 45), ("Helvetica", 11), text = "Place"),
            Rule((cols[0], 63), 6*72, thickness = 1),
            Element((cols[0], 67), ("Helvetica", 6), text = " "),
        ])


        if False:
            rpt.pagefooter = Band([
                Element((36, 16), ("Helvetica-Bold", 12), sysvar = "pagenumber", format = lambda x: "Page %d" % x),
                Element((300, 16), ("Helvetica-Bold", 12), text = f"{tothours}", align = "right")
            ])
        
        canvas = Canvas(pdf_file,  pagesize=A4)
        rpt.generate(canvas)
        canvas.save()
Example #3
0
def print_timesheets(yyyy: str, mm:str, path: str, uids: List = []) -> None:    

    for uid in uids:
        qry = (t.tracking_date.year()==int(yyyy)) &(t.tracking_date.month()==int(mm)) &(t.user_id==uid)

        rows = db(qry).select()
        tothours = tot_hours(rows)[:-3]
        data = rows.as_list()

        if False:        
            import sys
            print(tothours)
            sys.exit()

        user = db(u.id==uid).select().first()
        
        pdf_file = Path(path) / f"{yyyy[2:4]}{mm}-timesheet {user.last_name} {user.first_name}.pdf"

        cols = [30, 130, 170, 210, 250, 310, 350]

        rpt = Report(datasource = data, 
                    detailband = Band([
                        Element((cols[0], 0),  ("Helvetica", 10), key = 'tracking_date', format = lambda x: x.strftime("%Y-%m-%d %a")),
                        Element((cols[1], 0), ("Helvetica", 10), key = 'time_start', format = lambda x: x.strftime("%H:%M")),
                        Element((cols[2], 0), ("Helvetica", 10), key = 'time_end', format = lambda x: x.strftime("%H:%M")),
                        Element((cols[3], 0), ("Helvetica", 10), key = 'time_break', format = lambda x: x.strftime("%H:%M")),
                        Element((cols[4], 0), ("Helvetica-Bold", 10), key = 'total_time', format = lambda x: x[:-3]),
                        Element((cols[5], 0), ("Helvetica", 10), key = 'place'),
                        # Element((cols[6], 0), ("Helvetica", 10), key = 'comments'),
                    ]))

        rpt.pageheader = Band([
            Element((cols[0], 0), ("Times-Bold", 18), text = f"{user.last_name} {user.first_name}"),
            Element((cols[0]+150, 7), ("Helvetica", 11), text = "timesheet"),
            Element((cols[0]+150+52, 0), ("Times-Bold", 18), text = f"{yyyy}-{mm}"),
            Element((cols[0]+150+52+125, 7), ("Helvetica", 11), text = "total hours: "),
            Element((cols[0]+150+52+125+60, 0), ("Times-Bold", 18), text = f"{tothours}"),

            Element((cols[0], 45), ("Helvetica", 11), text = "Date"),
            Element((cols[1], 45), ("Helvetica", 11), text = "Start"),
            Element((cols[2], 45), ("Helvetica", 11), text = "End"),
            Element((cols[3], 45), ("Helvetica", 11), text = "Break"),
            Element((cols[4], 45), ("Helvetica", 11), text = "Total"),
            Element((cols[5], 45), ("Helvetica", 11), text = "Place"),
            Rule((cols[0], 63), 6*72, thickness = 1),
            Element((cols[0], 67), ("Helvetica", 6), text = " "),
        ])
        
        canvas = Canvas(str(pdf_file.absolute(),)  pagesize=A4)
        rpt.generate(canvas)
        canvas.save()
def funit_dscd_er(self, format, param):
    print(param)
    print(format)
    report_data = UnitSancDesg.objects.values(
        'u_id', 'd5', 'u_name', 'd_gdesig', 'd_id', 'd_rank', 'd_discp',
        'd_name', 'd_grade', 'd_gcode', 'tot', 'san', 'req', 'comment',
        'd_cadre').annotate(total_count=ExpressionWrapper(
            F('san') + F('tot') +
            F('req'), output_field=models.IntegerField())).filter(
                u_id=param['u_id'],
                total_count__gt=0).order_by('d5', 'd_gcode')
    print(report_data)
    rpt = Report(report_data)

    pos_x_start = 36
    pos_y_start = 24
    col_1_pos = (pos_x_start, pos_y_start)
    col_2_pos = (col_1_pos[0] + 200, pos_y_start)
    col_3_pos = (col_2_pos[0] + 100, pos_y_start)
    col_4_pos = (col_3_pos[0] + 50, pos_y_start)
    col_5_pos = (col_4_pos[0] + 50, pos_y_start)
    col_6_pos = (col_5_pos[0] + 50, pos_y_start)
    col_7_pos = (col_6_pos[0] + 50, pos_y_start)

    rpt.pageheader = Band([
        Element((36, 0), ("Times-Bold", 20),
                getvalue=lambda x: x["u_name"].upper(),
                format=lambda x: "Unit Summary : %s" % x),
        Element(col_1_pos, ("Helvetica-Bold", 12), text="Designation"),
        Element(col_2_pos, ("Helvetica-Bold", 12),
                text="Grade",
                align="center"),
        Element(col_3_pos, ("Helvetica-Bold", 12),
                text="Cadre",
                align="center"),
        Element(col_4_pos, ("Helvetica-Bold", 12),
                text="Ext",
                align="center",
                width=50),
        Element(col_5_pos, ("Helvetica-Bold", 12),
                text="Req",
                align="center",
                width=50),
        Element(col_6_pos, ("Helvetica-Bold", 12),
                text="San",
                align="center",
                width=50),
        # Element(col_7_pos, ("Helvetica-Bold", 12), text="San", align="center", width=50),
        Rule((36, 56), 7.5 * 72, thickness=2),
    ])

    rpt.groupheaders = [
        Band(
            [
                # Rule((36, 20), 7.5 * 72),
                Element(
                    (36, 4),
                    ("Helvetica-Bold", 10),
                    getvalue=lambda x: x["d_gdesig"].upper(),
                    # format=lambda x: "Group Designation : %s" % x
                ),
            ],
            getvalue=lambda x: x["d_gdesig"].upper()),
    ]

    comment_band = Band([
        Element(
            (col_1_pos[0], 0),
            ("Helvetica", 10),
            key="comment",
            align="left",
        )
    ])
    rpt.detailband = Band([
        Element(
            (col_1_pos[0], 0),
            ("Helvetica", 10),
            getvalue=lambda x: x["d_name"].upper(),
        ),
        Element((col_2_pos[0], 0), ("Helvetica", 10),
                key="d_grade",
                align="left"),
        Element((col_3_pos[0], 0), ("Helvetica", 10),
                key="d_cadre",
                align="right"),
        Element((col_4_pos[0], 0), ("Helvetica", 10),
                getvalue=lambda x: x["tot"] or 0,
                align="right"),
        Element((col_5_pos[0], 0), ("Helvetica", 10),
                getvalue=lambda x: x["req"] or 0,
                align="right"),
        Element((col_6_pos[0], 0), ("Helvetica", 10),
                getvalue=lambda x: x["san"] or 0,
                align="right")
    ])  #, additionalbands=[comment_band]

    rpt.groupfooters = [
        Band(
            [
                Rule((col_4_pos[0] - 24, 4), 30),
                Rule((col_5_pos[0] - 24, 4), 30),
                Rule((col_6_pos[0] - 24, 4), 30),
                Element((col_1_pos[0], 4), ("Helvetica-Bold", 10),
                        getvalue=lambda x: x["d_gdesig"].upper(),
                        format=lambda x: "Subtotal"
                        # format=lambda x: "Subtotal for %s" % x
                        ),
                SumElement((col_4_pos[0], 4), ("Helvetica-Bold", 10),
                           key="tot",
                           align="right"),
                SumElement((col_5_pos[0], 4), ("Helvetica-Bold", 10),
                           key="req",
                           align="right"),
                SumElement((col_6_pos[0], 4), ("Helvetica-Bold", 10),
                           key="san",
                           align="right"),
                Element((36, 16), ("Helvetica-Bold", 10), text=""),
            ],
            getvalue=lambda x: x["d_gdesig"].upper(),
            newpageafter=0),
    ]

    rpt.reportfooter = Band([
        Rule((col_4_pos[0] - 24, 4), 30),
        Rule((col_5_pos[0] - 24, 4), 30),
        Rule((col_6_pos[0] - 24, 4), 30),
        Element((240, 4), ("Helvetica-Bold", 10), text="Unit Total"),
        SumElement((col_4_pos[0], 4), ("Helvetica-Bold", 10),
                   key="tot",
                   align="right"),
        SumElement((col_5_pos[0], 4), ("Helvetica-Bold", 10),
                   key="req",
                   align="right"),
        SumElement((col_6_pos[0], 4), ("Helvetica-Bold", 10),
                   key="san",
                   align="right"),
        Element((36, 16), ("Helvetica-Bold", 10), text=""),
    ])

    rpt.pagefooter = Band([
        Element((400, 16), ("Times-Bold", 10),
                text="Industrial Engineering Dept, WCL HQ",
                align="right"),
        Element((36, 16), ("Helvetica-Bold", 10),
                sysvar="pagenumber",
                format=lambda x: "Page %d" % x),
    ])

    file_loc = "./report_folder/" + param['u_id'] + ".pdf"
    canvas = Canvas(file_loc, (210 * mm, 297 * mm))
    rpt.generate(canvas)
    print("report generated at %s" % file_loc)
    canvas.save()

    return file_loc