619 lines
16 KiB
HTML
619 lines
16 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Daily Progress Report</title>
|
|
<style>
|
|
body {
|
|
margin: 0;
|
|
padding: 0;
|
|
font-family: Arial, sans-serif;
|
|
background: #f5f5f5;
|
|
color: #333;
|
|
}
|
|
|
|
.container {
|
|
max-width: 1100px;
|
|
margin: 20px auto;
|
|
background: #fff;
|
|
border-radius: 8px;
|
|
overflow: hidden;
|
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.header {
|
|
background: #49bf3c;
|
|
color: #fff;
|
|
padding: 20px;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.header h1 {
|
|
font-size: 22px;
|
|
margin: 0;
|
|
}
|
|
|
|
.header .project-info {
|
|
font-size: 14px;
|
|
text-align: right;
|
|
}
|
|
|
|
.status-note {
|
|
font-size: 12px;
|
|
color: #555;
|
|
padding: 15px 20px 0 20px;
|
|
}
|
|
|
|
.status-cards {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
gap: 15px;
|
|
padding: 20px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.card {
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex: 1;
|
|
min-width: 200px;
|
|
border: 1px solid #ddd;
|
|
border-radius: 8px;
|
|
padding: 15px;
|
|
text-align: center;
|
|
background: #fff;
|
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
|
|
/* <-- added shadow */
|
|
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
|
border-top: 1px solid #49bf3c;
|
|
|
|
}
|
|
|
|
.card-link {
|
|
position: absolute;
|
|
top: 8px;
|
|
right: 8px;
|
|
width: 28px;
|
|
height: 28px;
|
|
display: none;
|
|
align-items: center;
|
|
justify-content: center;
|
|
border-radius: 6px;
|
|
text-decoration: none;
|
|
/* arrow color */
|
|
background: #f5f5f5;
|
|
/* badge background */
|
|
box-shadow: 0 1px 3px rgba(0, 0, 0, .15);
|
|
}
|
|
|
|
.card-link-success {
|
|
color: #49bf3c;
|
|
}
|
|
|
|
.card-link-warning {
|
|
color: #ffc107;
|
|
}
|
|
|
|
.card-link-primary {
|
|
color: #007bff;
|
|
}
|
|
|
|
.card-link:hover {
|
|
background: #ececec;
|
|
}
|
|
|
|
.card-link:focus {
|
|
outline: 2px solid #9ca3af;
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
.card-link .arrow {
|
|
font-size: 16px;
|
|
line-height: 1;
|
|
}
|
|
|
|
.card:hover .card-link {
|
|
display: inline-flex;
|
|
/* <— show only on this card */
|
|
}
|
|
|
|
.card:hover {
|
|
transform: translateY(-3px);
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
.card h3 {
|
|
font-size: 14px;
|
|
margin: 0 0 10px 0;
|
|
}
|
|
|
|
.card p {
|
|
margin: 5px 0;
|
|
}
|
|
|
|
.card .value {
|
|
font-size: 22px;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.card-title {
|
|
font-size: 0.9rem;
|
|
text-transform: uppercase;
|
|
font-weight: 600;
|
|
color: #6c757d;
|
|
}
|
|
|
|
.attendance {
|
|
color: #49bf3c;
|
|
}
|
|
|
|
.tasks {
|
|
color: #007bff;
|
|
}
|
|
|
|
.completion {
|
|
color: #28a745;
|
|
}
|
|
|
|
.activities {
|
|
padding: 20px;
|
|
}
|
|
|
|
.activities h2 {
|
|
font-size: 18px;
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.table th,
|
|
.table td {
|
|
border: 1px solid #ddd;
|
|
padding: 8px;
|
|
text-align: center;
|
|
}
|
|
|
|
.table th {
|
|
background: #f0f0f0;
|
|
}
|
|
|
|
.footer {
|
|
/* background: #b10000; */
|
|
background: #49bf3c;
|
|
color: #fff;
|
|
text-align: center;
|
|
padding: 15px;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.footer a {
|
|
color: #fff;
|
|
margin: 0 8px;
|
|
text-decoration: none;
|
|
}
|
|
|
|
/* Responsive */
|
|
@media (max-width: 600px) {
|
|
.header {
|
|
flex-direction: column;
|
|
text-align: center;
|
|
}
|
|
|
|
.header .project-info {
|
|
text-align: center;
|
|
margin-top: 10px;
|
|
}
|
|
|
|
.status-cards {
|
|
flex-direction: column;
|
|
}
|
|
}
|
|
|
|
.legend {
|
|
margin-top: 10px;
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
flex-wrap: wrap;
|
|
gap: 8px;
|
|
font-size: 12px;
|
|
color: #555;
|
|
}
|
|
|
|
.legend-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
}
|
|
|
|
.legend-color {
|
|
width: 10px;
|
|
height: 10px;
|
|
border-radius: 2px;
|
|
display: inline-block;
|
|
}
|
|
|
|
.legend-red {
|
|
background: #e63946;
|
|
}
|
|
|
|
.legend-blue {
|
|
background: #007bff;
|
|
}
|
|
|
|
.legend-green {
|
|
background: #28a745;
|
|
}
|
|
|
|
.legend-gray {
|
|
background: #ccc;
|
|
}
|
|
|
|
.legend-yellow {
|
|
background: #ffc107;
|
|
}
|
|
|
|
|
|
|
|
.donut {
|
|
--percentage: 0;
|
|
/* Change this per chart */
|
|
--danger: #e63946;
|
|
--primary: #007bff;
|
|
--warning: #ffc107;
|
|
--success: #28a745;
|
|
/* Fill color */
|
|
--track: #e9ecef;
|
|
/* Background track */
|
|
--size: 200px;
|
|
/* Default size */
|
|
--thickness: 20px;
|
|
/* Default thickness */
|
|
|
|
width: var(--size);
|
|
height: var(--size);
|
|
border-radius: 50%;
|
|
/* background: conic-gradient(var(--danger) calc(var(--percentage) * 1%),
|
|
var(--track) 0); */
|
|
background: conic-gradient(var(--track) 100%);
|
|
position: relative;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-family: Arial, sans-serif;
|
|
font-weight: bold;
|
|
color: #333;
|
|
}
|
|
|
|
.donut::before {
|
|
content: "";
|
|
position: absolute;
|
|
width: calc(var(--size) - var(--thickness));
|
|
height: calc(var(--size) - var(--thickness));
|
|
border-radius: 50%;
|
|
background: #fff;
|
|
/* Inner cut-out */
|
|
}
|
|
|
|
.donut span {
|
|
position: absolute;
|
|
font-size: calc(var(--size) / 6);
|
|
width:80%;
|
|
box-sizing:border-box;
|
|
display:flex;
|
|
gap: 4px;
|
|
flex-wrap: wrap;
|
|
justify-content:center;
|
|
align-items:center;
|
|
}
|
|
|
|
/* Variants */
|
|
.donut.thin {
|
|
--size: 80px;
|
|
--thickness: 12px;
|
|
}
|
|
|
|
.donut.medium {
|
|
--size: 120px;
|
|
--thickness: 15px;
|
|
}
|
|
|
|
.donut.large {
|
|
--size: 180px;
|
|
--thickness: 35px;
|
|
}
|
|
|
|
/* Color variants */
|
|
.donut-success {
|
|
background: conic-gradient(var(--success) calc(var(--percentage) * 1%),
|
|
var(--track) 0);
|
|
}
|
|
|
|
.donut-warning {
|
|
background: conic-gradient(var(--warning) calc(var(--percentage) * 1%),
|
|
var(--track) 0);
|
|
}
|
|
|
|
.donut-danger {
|
|
background: conic-gradient(var(--danger) calc(var(--percentage) * 1%),
|
|
var(--track) 0);
|
|
}
|
|
|
|
.donut-primary {
|
|
background: conic-gradient(var(--primary) calc(var(--percentage) * 1%),
|
|
var(--track) 0);
|
|
}
|
|
|
|
.values {
|
|
display: flex;
|
|
flex-wrap: nowrap;
|
|
gap: 8px;
|
|
}
|
|
|
|
.values p {
|
|
margin: 0;
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
max-width: 200px;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<div class="container">
|
|
<!-- Header -->
|
|
<div class="header">
|
|
<h1>Daily Progress Report</h1>
|
|
<div class="project-info">
|
|
<strong>Project:</strong> {{projectName}}<br>
|
|
<strong>Date:</strong> {{date}}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Status Note -->
|
|
<div class="status-note">
|
|
* Project Status Reported - Generated at {{timeStamp}} UTC
|
|
</div>
|
|
|
|
<!-- Status Cards -->
|
|
<div class="status-cards">
|
|
<div class="card">
|
|
<a class="card-link card-link-warning" href={{webUrl}} aria-label="Open original website" title="Open website" target="_blank"
|
|
rel="noopener">
|
|
<span class="arrow">↗</span>
|
|
</a>
|
|
<h4 class="card-title">TODAY'S ATTENDANCE</h4>
|
|
<div style="display:flex; flex-wrap:wrap;">
|
|
|
|
<!-- Left Column -->
|
|
<div style="width:50%; box-sizing:border-box;display:flex; justify-content:center; align-items:center;">
|
|
<!-- Medium -->
|
|
<div class="donut thin donut-warning" style="--percentage: {{attendancePercentage}};">
|
|
<span>
|
|
<p style="color:#ffc107;">{{todaysAttendances}}</p><p>/</p><p style="color:#ccc;">{{totalEmployees}}</p>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Right Column -->
|
|
<div class="legend" style="width:50%; padding:15px; box-sizing:border-box;">
|
|
<div class="legend-item"
|
|
style="margin-bottom:10px;text-align: left; display:left; justify-content:left; align-items:left!important;; ">
|
|
<span class="legend-color legend-yellow"></span> Today's Attendance
|
|
</div>
|
|
<div class="legend-item"
|
|
style="margin-bottom:10px; text-align: left; display:left; justify-content:left; align-items:left!important;;">
|
|
<span class="legend-color legend-gray"></span> Total Employees
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<a class="card-link card-link-primary" href={{webUrl}} aria-label="Open original website" title="Open website" target="_blank"
|
|
rel="noopener">
|
|
<span class="arrow">↗</span>
|
|
</a>
|
|
<h4 class="card-title">DAILY TASKS COMPLETED</h4>
|
|
<div style="display:flex; flex-wrap:wrap;">
|
|
|
|
<!-- Left Column -->
|
|
<div style="width:50%; box-sizing:border-box;display:flex; justify-content:center; align-items:center;">
|
|
<!-- Medium -->
|
|
<div class="donut thin donut-primary" style="--percentage: {{taskPercentage}};">
|
|
<span >
|
|
<p style="color:#007bff;">{{totalCompletedTask}}</p><p>/</p><p style="color:#ccc;">{{totalPlannedTask}}</p>
|
|
</span>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Right Column -->
|
|
<div class="legend" style="width:50%; padding:15px; box-sizing:border-box;">
|
|
<div class="legend-item"
|
|
style="margin-bottom:10px;text-align: left; display:left; justify-content:left; align-items:left!important;; ">
|
|
<span class="legend-color legend-blue"></span> Completed Work
|
|
</div>
|
|
<div class="legend-item"
|
|
style="margin-bottom:10px; text-align: left; display:left; justify-content:left; align-items:left!important;;">
|
|
<span class="legend-color legend-gray"></span> Planned Work
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div style="text-align: end!important;">
|
|
<p style="font-size: xx-small;">*Today's Total Work</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<a class="card-link card-link-success" href={{webUrl}} aria-label="Open original website" title="Open website" target="_blank"
|
|
rel="noopener">
|
|
<span class="arrow">↗</span>
|
|
</a>
|
|
<h4 class="card-title">PROJECT COMPLETION STATUS</h4>
|
|
<div style="display:flex; flex-wrap:wrap;">
|
|
|
|
<!-- Left Column -->
|
|
<div style="width:50%; box-sizing:border-box;display:flex; justify-content:center; align-items:center;">
|
|
<!-- Medium -->
|
|
<div class="donut thin donut-success" style="--percentage: {{completionStatus}};">
|
|
<span>
|
|
<p style="color:#28a745;">{{totalCompletedWork}}</p> <p>/</p> <p style="color:#ccc;">{{totalPlannedWork}}</p>
|
|
</span>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Right Column -->
|
|
<div class="legend" style="width:50%; padding:15px; box-sizing:border-box;">
|
|
<div class="legend-item"
|
|
style="margin-bottom:10px;text-align: left; display:left; justify-content:left; align-items:left!important;; ">
|
|
<span class="legend-color legend-green"></span> Completed Work
|
|
</div>
|
|
<div class="legend-item"
|
|
style="margin-bottom:10px; text-align: left; display:left; justify-content:left; align-items:left!important;;">
|
|
<span class="legend-color legend-gray"></span> Planned Work
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div style="text-align: end!important;">
|
|
<p style="font-size: xx-small;">*Project's Total Work</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<a class="card-link" href={{webUrl}} aria-label="Open original website" title="Open website" target="_blank"
|
|
rel="noopener">
|
|
<span class="arrow">↗</span>
|
|
</a>
|
|
<div>
|
|
<h4 class="card-title">Pending Attendance</h4>
|
|
</div>
|
|
<table style="width: 100%;">
|
|
<tr>
|
|
<td style="text-align: left;">Regularization Pending</td>
|
|
<td style="text-align: right;">{{regularizationPending}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="text-align: left;">Checkout Pending</td>
|
|
<td style="text-align: right;">{{checkoutPending}}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<a class="card-link" href={{webUrl}} aria-label="Open original website" title="Open website" target="_blank"
|
|
rel="noopener">
|
|
<span class="arrow">↗</span>
|
|
</a>
|
|
<div>
|
|
<h4 class="card-title">Activity Report Pending</h4>
|
|
</div>
|
|
<table style="width: 100%;">
|
|
<tr>
|
|
<td style="text-align: left;">Total Pending Tasks</td>
|
|
<td style="text-align: right;">{{reportPending}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="text-align: left;">Today's Assigned Tasks</td>
|
|
<td style="text-align: right;">{{todaysAssignTasks}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="text-align: left;">Today's Completed Tasks</td>
|
|
<td style="text-align: right;">{{todaysCompletedTasks}}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
|
|
{% if teamOnSite and teamOnSite|length > 0 %}
|
|
<div class="card">
|
|
<a class="card-link" href={{webUrl}} aria-label="Open original website" title="Open website" target="_blank"
|
|
rel="noopener">
|
|
<span class="arrow">↗</span>
|
|
</a>
|
|
<!-- Row 1: Header -->
|
|
<div>
|
|
<h4 class="card-title">Team Strength on Site</h4>
|
|
</div>
|
|
<table style="width: 100%;">
|
|
{% for a in teamOnSite %}
|
|
<tr>
|
|
<td style="text-align: left;">{{a.roleName}}</td>
|
|
<td style="text-align: right;">{{a.numberofEmployees}}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Activities
|
|
{% if performedTasks and performedTasks|length > 0 %}
|
|
<div class="activities">
|
|
<h2>Activities (Tasks) Performed {{date}}</h2>
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>Activity/Location</th>
|
|
<th>Assigned Today/Pending</th>
|
|
<th>Completed Today</th>
|
|
<th>Date</th>
|
|
<th>Team Members</th>
|
|
<th>Comment</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for a in performedTasks %}
|
|
<tr>
|
|
<td>{{a.activity}} {{a.location}}</td>
|
|
<td>{{a.assignedToday}} / {{a.pending}}</td>
|
|
<td>{{a.completedToday}}</td>
|
|
<td>{{date}}</td>
|
|
<td></td>
|
|
<td>{{a.comment}}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %} -->
|
|
|
|
</div>
|
|
</div>
|
|
<!-- Footer -->
|
|
<div class="footer" style="display:flex; flex-wrap:wrap;">
|
|
<div style="width: 50%;text-align: left;">
|
|
Contact Us: contact[at]marcoaiot.com<br>
|
|
Marco AIoT technologies Pvt. Ltd. ©2025 All Rights Reserved
|
|
</div>
|
|
|
|
<div style="width: 50%; text-align: right;">
|
|
<!-- <a href="#">Instagram</a> | -->
|
|
<a href="https://www.linkedin.com/company/marco-aiot">Linkedin</a> |
|
|
|
|
<a href="https://x.com/marcoaiot"><img src="https://cdn.marcoaiot.com/icons/brands/twitter.png" style="height: 15px;" /></a> |
|
|
|
|
<a href="#"><img src="https://cdn.marcoaiot.com/icons/brands/facebook.png" style="height: 15px;" /></a> |
|
|
<a href="#"><img src="https://cdn.marcoaiot.com/icons/brands/instagram.png" style="height: 15px;" /></a>
|
|
<!-- <a href="#"><img src="https://cdn.marcoaiot.com/icons/brands/youtube.png" style="height: 15px;" /></a> | <a
|
|
href="#">LinkedIn</a> |
|
|
<a href="#">YouTube</a> -->
|
|
</div>
|
|
|
|
</div>
|
|
<div style="text-align: center;width: 100%;background-color: #fff;margin:10px;margin-bottom: 30px!important;font-size: small;color: #6c757d ;">
|
|
You have received this email because it contains important information about your {{websiteName}} Account account.
|
|
</div>
|
|
</div>
|
|
</body>
|
|
|
|
</html> |