[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FJS9WF0MEYF4J1F2Y2YEYN":3,"skill-same:01M6FJS9WF0MEYF4J1F2Y2YEYN":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":60},"01M6FJS9WF0MEYF4J1F2Y2YEYN","daily-progress-report",null,"Generate automated daily progress reports from site data. Track work completed, labor hours, equipment usage, and weather conditions.","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fdaily-progress-report\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[23,24,25,26,27,28,29,30,31,32,33],"report","daily","progress","daily progress report","weather","generate","data","site","work","reports","usage","2026-11-10 10:12:30",false,"---\r\nslug: \"daily-progress-report\"\r\ndisplay_name: \"Daily Progress Report\"\r\ndescription: \"Generate automated daily progress reports from site data. Track work completed, labor hours, equipment usage, and weather conditions.\"\r\n---\r\n\r\n# Daily Progress Report Generator\r\n\r\n## Business Case\r\n\r\n### Problem Statement\r\nSite managers spend hours creating daily reports:\r\n- Manual data collection\r\n- Inconsistent formats\r\n- Delayed submissions\r\n- Missing information\r\n\r\n### Solution\r\nAutomated daily progress report generation from structured site data inputs.\r\n\r\n## Technical Implementation\r\n\r\n```python\r\nimport pandas as pd\r\nfrom datetime import datetime, date\r\nfrom typing import Dict, Any, List\r\nfrom dataclasses import dataclass\r\nfrom enum import Enum\r\n\r\n\r\nclass WeatherCondition(Enum):\r\n    CLEAR = \"clear\"\r\n    CLOUDY = \"cloudy\"\r\n    RAIN = \"rain\"\r\n    SNOW = \"snow\"\r\n    WIND = \"wind\"\r\n    EXTREME = \"extreme\"\r\n\r\n\r\nclass WorkStatus(Enum):\r\n    COMPLETED = \"completed\"\r\n    IN_PROGRESS = \"in_progress\"\r\n    DELAYED = \"delayed\"\r\n    NOT_STARTED = \"not_started\"\r\n\r\n\r\n@dataclass\r\nclass WorkActivity:\r\n    activity_id: str\r\n    description: str\r\n    location: str\r\n    planned_qty: float\r\n    actual_qty: float\r\n    unit: str\r\n    status: WorkStatus\r\n    crew_size: int\r\n    hours_worked: float\r\n    notes: str = \"\"\r\n\r\n\r\n@dataclass\r\nclass LaborEntry:\r\n    trade: str\r\n    company: str\r\n    workers: int\r\n    hours: float\r\n    overtime_hours: float = 0\r\n\r\n\r\n@dataclass\r\nclass EquipmentEntry:\r\n    equipment_type: str\r\n    equipment_id: str\r\n    hours_used: float\r\n    status: str  # active, idle, maintenance\r\n    operator: str = \"\"\r\n\r\n\r\n@dataclass\r\nclass DailyReport:\r\n    report_date: date\r\n    project_name: str\r\n    project_number: str\r\n    weather: WeatherCondition\r\n    temperature_high: float\r\n    temperature_low: float\r\n    work_activities: List[WorkActivity]\r\n    labor: List[LaborEntry]\r\n    equipment: List[EquipmentEntry]\r\n    delays: List[str]\r\n    safety_incidents: int\r\n    visitors: List[str]\r\n    deliveries: List[str]\r\n    prepared_by: str\r\n\r\n\r\nclass DailyProgressReporter:\r\n    \"\"\"Generate daily progress reports.\"\"\"\r\n\r\n    def __init__(self, project_name: str, project_number: str):\r\n        self.project_name = project_name\r\n        self.project_number = project_number\r\n\r\n    def create_report(self,\r\n                      report_date: date,\r\n                      weather: WeatherCondition,\r\n                      temp_high: float,\r\n                      temp_low: float,\r\n                      prepared_by: str) -> DailyReport:\r\n        \"\"\"Create new daily report.\"\"\"\r\n\r\n        return DailyReport(\r\n            report_date=report_date,\r\n            project_name=self.project_name,\r\n            project_number=self.project_number,\r\n            weather=weather,\r\n            temperature_high=temp_high,\r\n            temperature_low=temp_low,\r\n            work_activities=[],\r\n            labor=[],\r\n            equipment=[],\r\n            delays=[],\r\n            safety_incidents=0,\r\n            visitors=[],\r\n            deliveries=[],\r\n            prepared_by=prepared_by\r\n        )\r\n\r\n    def add_work_activity(self,\r\n                          report: DailyReport,\r\n                          activity_id: str,\r\n                          description: str,\r\n                          location: str,\r\n                          planned_qty: float,\r\n                          actual_qty: float,\r\n                          unit: str,\r\n                          crew_size: int,\r\n                          hours_worked: float,\r\n                          notes: str = \"\"):\r\n        \"\"\"Add work activity to report.\"\"\"\r\n\r\n        # Determine status\r\n        if actual_qty >= planned_qty:\r\n            status = WorkStatus.COMPLETED\r\n        elif actual_qty > 0:\r\n            status = WorkStatus.IN_PROGRESS\r\n        elif actual_qty == 0 and planned_qty > 0:\r\n            status = WorkStatus.DELAYED\r\n        else:\r\n            status = WorkStatus.NOT_STARTED\r\n\r\n        activity = WorkActivity(\r\n            activity_id=activity_id,\r\n            description=description,\r\n            location=location,\r\n            planned_qty=planned_qty,\r\n            actual_qty=actual_qty,\r\n            unit=unit,\r\n            status=status,\r\n            crew_size=crew_size,\r\n            hours_worked=hours_worked,\r\n            notes=notes\r\n        )\r\n\r\n        report.work_activities.append(activity)\r\n\r\n    def add_labor(self,\r\n                  report: DailyReport,\r\n                  trade: str,\r\n                  company: str,\r\n                  workers: int,\r\n                  hours: float,\r\n                  overtime_hours: float = 0):\r\n        \"\"\"Add labor entry.\"\"\"\r\n\r\n        report.labor.append(LaborEntry(\r\n            trade=trade,\r\n            company=company,\r\n            workers=workers,\r\n            hours=hours,\r\n            overtime_hours=overtime_hours\r\n        ))\r\n\r\n    def add_equipment(self,\r\n                      report: DailyReport,\r\n                      equipment_type: str,\r\n                      equipment_id: str,\r\n                      hours_used: float,\r\n                      status: str,\r\n                      operator: str = \"\"):\r\n        \"\"\"Add equipment entry.\"\"\"\r\n\r\n        report.equipment.append(EquipmentEntry(\r\n            equipment_type=equipment_type,\r\n            equipment_id=equipment_id,\r\n            hours_used=hours_used,\r\n            status=status,\r\n            operator=operator\r\n        ))\r\n\r\n    def calculate_summary(self, report: DailyReport) -> Dict[str, Any]:\r\n        \"\"\"Calculate report summary metrics.\"\"\"\r\n\r\n        total_workers = sum(l.workers for l in report.labor)\r\n        total_manhours = sum(l.workers * l.hours for l in report.labor)\r\n        total_overtime = sum(l.workers * l.overtime_hours for l in report.labor)\r\n        equipment_hours = sum(e.hours_used for e in report.equipment)\r\n\r\n        completed = sum(1 for a in report.work_activities if a.status == WorkStatus.COMPLETED)\r\n        in_progress = sum(1 for a in report.work_activities if a.status == WorkStatus.IN_PROGRESS)\r\n        delayed = sum(1 for a in report.work_activities if a.status == WorkStatus.DELAYED)\r\n\r\n        return {\r\n            'total_workers': total_workers,\r\n            'total_manhours': round(total_manhours, 1),\r\n            'total_overtime': round(total_overtime, 1),\r\n            'equipment_hours': round(equipment_hours, 1),\r\n            'activities_completed': completed,\r\n            'activities_in_progress': in_progress,\r\n            'activities_delayed': delayed,\r\n            'safety_incidents': report.safety_incidents,\r\n            'deliveries_count': len(report.deliveries)\r\n        }\r\n\r\n    def export_to_excel(self, report: DailyReport, output_path: str) -> str:\r\n        \"\"\"Export report to Excel.\"\"\"\r\n\r\n        with pd.ExcelWriter(output_path, engine='openpyxl') as writer:\r\n            # Header\r\n            header_df = pd.DataFrame([{\r\n                'Project': report.project_name,\r\n                'Project #': report.project_number,\r\n                'Date': report.report_date,\r\n                'Weather': report.weather.value,\r\n                'High Temp': report.temperature_high,\r\n                'Low Temp': report.temperature_low,\r\n                'Prepared By': report.prepared_by\r\n            }])\r\n            header_df.to_excel(writer, sheet_name='Summary', index=False)\r\n\r\n            # Work Activities\r\n            if report.work_activities:\r\n                activities_df = pd.DataFrame([\r\n                    {\r\n                        'Activity ID': a.activity_id,\r\n                        'Description': a.description,\r\n                        'Location': a.location,\r\n                        'Planned': a.planned_qty,\r\n                        'Actual': a.actual_qty,\r\n                        'Unit': a.unit,\r\n                        'Status': a.status.value,\r\n                        'Crew': a.crew_size,\r\n                        'Hours': a.hours_worked,\r\n                        'Notes': a.notes\r\n                    }\r\n                    for a in report.work_activities\r\n                ])\r\n                activities_df.to_excel(writer, sheet_name='Work Activities', index=False)\r\n\r\n            # Labor\r\n            if report.labor:\r\n                labor_df = pd.DataFrame([\r\n                    {\r\n                        'Trade': l.trade,\r\n                        'Company': l.company,\r\n                        'Workers': l.workers,\r\n                        'Hours': l.hours,\r\n                        'Overtime': l.overtime_hours,\r\n                        'Total Hours': l.workers * (l.hours + l.overtime_hours)\r\n                    }\r\n                    for l in report.labor\r\n                ])\r\n                labor_df.to_excel(writer, sheet_name='Labor', index=False)\r\n\r\n            # Equipment\r\n            if report.equipment:\r\n                equip_df = pd.DataFrame([\r\n                    {\r\n                        'Type': e.equipment_type,\r\n                        'ID': e.equipment_id,\r\n                        'Hours': e.hours_used,\r\n                        'Status': e.status,\r\n                        'Operator': e.operator\r\n                    }\r\n                    for e in report.equipment\r\n                ])\r\n                equip_df.to_excel(writer, sheet_name='Equipment', index=False)\r\n\r\n        return output_path\r\n\r\n    def generate_text_report(self, report: DailyReport) -> str:\r\n        \"\"\"Generate text version of report.\"\"\"\r\n\r\n        summary = self.calculate_summary(report)\r\n\r\n        lines = [\r\n            f\"DAILY PROGRESS REPORT\",\r\n            f\"=\" * 50,\r\n            f\"Project: {report.project_name}\",\r\n            f\"Project #: {report.project_number}\",\r\n            f\"Date: {report.report_date}\",\r\n            f\"Prepared by: {report.prepared_by}\",\r\n            f\"\",\r\n            f\"WEATHER CONDITIONS\",\r\n            f\"-\" * 30,\r\n            f\"Conditions: {report.weather.value}\",\r\n            f\"Temperature: {report.temperature_low}°C - {report.temperature_high}°C\",\r\n            f\"\",\r\n            f\"SUMMARY\",\r\n            f\"-\" * 30,\r\n            f\"Total Workers: {summary['total_workers']}\",\r\n            f\"Total Man-hours: {summary['total_manhours']}\",\r\n            f\"Equipment Hours: {summary['equipment_hours']}\",\r\n            f\"Activities Completed: {summary['activities_completed']}\",\r\n            f\"Activities In Progress: {summary['activities_in_progress']}\",\r\n            f\"Activities Delayed: {summary['activities_delayed']}\",\r\n            f\"Safety Incidents: {summary['safety_incidents']}\",\r\n        ]\r\n\r\n        if report.delays:\r\n            lines.extend([f\"\", f\"DELAYS\", f\"-\" * 30])\r\n            for delay in report.delays:\r\n                lines.append(f\"• {delay}\")\r\n\r\n        return \"\\n\".join(lines)\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\nfrom datetime import date\r\n\r\n# Initialize reporter\r\nreporter = DailyProgressReporter(\"Office Tower A\", \"PRJ-2024-001\")\r\n\r\n# Create report\r\nreport = reporter.create_report(\r\n    report_date=date.today(),\r\n    weather=WeatherCondition.CLEAR,\r\n    temp_high=28,\r\n    temp_low=18,\r\n    prepared_by=\"John Smith\"\r\n)\r\n\r\n# Add activities\r\nreporter.add_work_activity(\r\n    report,\r\n    activity_id=\"A-101\",\r\n    description=\"Pour concrete slab Level 3\",\r\n    location=\"Level 3, Zone A\",\r\n    planned_qty=150,\r\n    actual_qty=150,\r\n    unit=\"m3\",\r\n    crew_size=8,\r\n    hours_worked=10\r\n)\r\n\r\n# Add labor\r\nreporter.add_labor(report, \"Concrete\", \"ABC Concrete Co\", 8, 10, 2)\r\n\r\n# Export\r\nreporter.export_to_excel(report, \"daily_report.xlsx\")\r\n```\r\n\r\n## Common Use Cases\r\n\r\n### 1. Generate Text Summary\r\n```python\r\ntext = reporter.generate_text_report(report)\r\nprint(text)\r\n```\r\n\r\n### 2. Track Delays\r\n```python\r\nreport.delays.append(\"Weather delay - rain from 14:00-16:00\")\r\nreport.delays.append(\"Material delivery late by 2 hours\")\r\n```\r\n\r\n### 3. Calculate Metrics\r\n```python\r\nsummary = reporter.calculate_summary(report)\r\nprint(f\"Productivity: {summary['total_manhours']} man-hours\")\r\n```\r\n\r\n## Resources\r\n- **DDC Book**: Chapter 4.1 - Site Data Collection\r\n","# Daily Progress Report Generator\r\n\r\n## Business Case\r\n\r\n### Problem Statement\r\nSite managers spend hours creating daily reports:\r\n- Manual data collection\r\n- Inconsistent formats\r\n- Delayed submissions\r\n- Missing information\r\n\r\n### Solution\r\nAutomated daily progress report generation from structured site data inputs.\r\n\r\n## Technical Implementation\r\n\r\n```python\r\nimport pandas as pd\r\nfrom datetime import datetime, date\r\nfrom typing import Dict, Any, List\r\nfrom dataclasses import dataclass\r\nfrom enum import Enum\r\n\r\n\r\nclass WeatherCondition(Enum):\r\n    CLEAR = \"clear\"\r\n    CLOUDY = \"cloudy\"\r\n    RAIN = \"rain\"\r\n    SNOW = \"snow\"\r\n    WIND = \"wind\"\r\n    EXTREME = \"extreme\"\r\n\r\n\r\nclass WorkStatus(Enum):\r\n    COMPLETED = \"completed\"\r\n    IN_PROGRESS = \"in_progress\"\r\n    DELAYED = \"delayed\"\r\n    NOT_STARTED = \"not_started\"\r\n\r\n\r\n@dataclass\r\nclass WorkActivity:\r\n    activity_id: str\r\n    description: str\r\n    location: str\r\n    planned_qty: float\r\n    actual_qty: float\r\n    unit: str\r\n    status: WorkStatus\r\n    crew_size: int\r\n    hours_worked: float\r\n    notes: str = \"\"\r\n\r\n\r\n@dataclass\r\nclass LaborEntry:\r\n    trade: str\r\n    company: str\r\n    workers: int\r\n    hours: float\r\n    overtime_hours: float = 0\r\n\r\n\r\n@dataclass\r\nclass EquipmentEntry:\r\n    equipment_type: str\r\n    equipment_id: str\r\n    hours_used: float\r\n    status: str  # active, idle, maintenance\r\n    operator: str = \"\"\r\n\r\n\r\n@dataclass\r\nclass DailyReport:\r\n    report_date: date\r\n    project_name: str\r\n    project_number: str\r\n    weather: WeatherCondition\r\n    temperature_high: float\r\n    temperature_low: float\r\n    work_activities: List[WorkActivity]\r\n    labor: List[LaborEntry]\r\n    equipment: List[EquipmentEntry]\r\n    delays: List[str]\r\n    safety_incidents: int\r\n    visitors: List[str]\r\n    deliveries: List[str]\r\n    prepared_by: str\r\n\r\n\r\nclass DailyProgressReporter:\r\n    \"\"\"Generate daily progress reports.\"\"\"\r\n\r\n    def __init__(self, project_name: str, project_number: str):\r\n        self.project_name = project_name\r\n        self.project_number = project_number\r\n\r\n    def create_report(self,\r\n                      report_date: date,\r\n                      weather: WeatherCondition,\r\n                      temp_high: float,\r\n                      temp_low: float,\r\n                      prepared_by: str) -> DailyReport:\r\n        \"\"\"Create new daily report.\"\"\"\r\n\r\n        return DailyReport(\r\n            report_date=report_date,\r\n            project_name=self.project_name,\r\n            project_number=self.project_number,\r\n            weather=weather,\r\n            temperature_high=temp_high,\r\n            temperature_low=temp_low,\r\n            work_activities=[],\r\n            labor=[],\r\n            equipment=[],\r\n            delays=[],\r\n            safety_incidents=0,\r\n            visitors=[],\r\n            deliveries=[],\r\n            prepared_by=prepared_by\r\n        )\r\n\r\n    def add_work_activity(self,\r\n                          report: DailyReport,\r\n                          activity_id: str,\r\n                          description: str,\r\n                          location: str,\r\n                          planned_qty: float,\r\n                          actual_qty: float,\r\n                          unit: str,\r\n                          crew_size: int,\r\n                          hours_worked: float,\r\n                          notes: str = \"\"):\r\n        \"\"\"Add work activity to report.\"\"\"\r\n\r\n        # Determine status\r\n        if actual_qty >= planned_qty:\r\n            status = WorkStatus.COMPLETED\r\n        elif actual_qty > 0:\r\n            status = WorkStatus.IN_PROGRESS\r\n        elif actual_qty == 0 and planned_qty > 0:\r\n            status = WorkStatus.DELAYED\r\n        else:\r\n            status = WorkStatus.NOT_STARTED\r\n\r\n        activity = WorkActivity(\r\n            activity_id=activity_id,\r\n            description=description,\r\n            location=location,\r\n            planned_qty=planned_qty,\r\n            actual_qty=actual_qty,\r\n            unit=unit,\r\n            status=status,\r\n            crew_size=crew_size,\r\n            hours_worked=hours_worked,\r\n            notes=notes\r\n        )\r\n\r\n        report.work_activities.append(activity)\r\n\r\n    def add_labor(self,\r\n                  report: DailyReport,\r\n                  trade: str,\r\n                  company: str,\r\n                  workers: int,\r\n                  hours: float,\r\n                  overtime_hours: float = 0):\r\n        \"\"\"Add labor entry.\"\"\"\r\n\r\n        report.labor.append(LaborEntry(\r\n            trade=trade,\r\n            company=company,\r\n            workers=workers,\r\n            hours=hours,\r\n            overtime_hours=overtime_hours\r\n        ))\r\n\r\n    def add_equipment(self,\r\n                      report: DailyReport,\r\n                      equipment_type: str,\r\n                      equipment_id: str,\r\n                      hours_used: float,\r\n                      status: str,\r\n                      operator: str = \"\"):\r\n        \"\"\"Add equipment entry.\"\"\"\r\n\r\n        report.equipment.append(EquipmentEntry(\r\n            equipment_type=equipment_type,\r\n            equipment_id=equipment_id,\r\n            hours_used=hours_used,\r\n            status=status,\r\n            operator=operator\r\n        ))\r\n\r\n    def calculate_summary(self, report: DailyReport) -> Dict[str, Any]:\r\n        \"\"\"Calculate report summary metrics.\"\"\"\r\n\r\n        total_workers = sum(l.workers for l in report.labor)\r\n        total_manhours = sum(l.workers * l.hours for l in report.labor)\r\n        total_overtime = sum(l.workers * l.overtime_hours for l in report.labor)\r\n        equipment_hours = sum(e.hours_used for e in report.equipment)\r\n\r\n        completed = sum(1 for a in report.work_activities if a.status == WorkStatus.COMPLETED)\r\n        in_progress = sum(1 for a in report.work_activities if a.status == WorkStatus.IN_PROGRESS)\r\n        delayed = sum(1 for a in report.work_activities if a.status == WorkStatus.DELAYED)\r\n\r\n        return {\r\n            'total_workers': total_workers,\r\n            'total_manhours': round(total_manhours, 1),\r\n            'total_overtime': round(total_overtime, 1),\r\n            'equipment_hours': round(equipment_hours, 1),\r\n            'activities_completed': completed,\r\n            'activities_in_progress': in_progress,\r\n            'activities_delayed': delayed,\r\n            'safety_incidents': report.safety_incidents,\r\n            'deliveries_count': len(report.deliveries)\r\n        }\r\n\r\n    def export_to_excel(self, report: DailyReport, output_path: str) -> str:\r\n        \"\"\"Export report to Excel.\"\"\"\r\n\r\n        with pd.ExcelWriter(output_path, engine='openpyxl') as writer:\r\n            # Header\r\n            header_df = pd.DataFrame([{\r\n                'Project': report.project_name,\r\n                'Project #': report.project_number,\r\n                'Date': report.report_date,\r\n                'Weather': report.weather.value,\r\n                'High Temp': report.temperature_high,\r\n                'Low Temp': report.temperature_low,\r\n                'Prepared By': report.prepared_by\r\n            }])\r\n            header_df.to_excel(writer, sheet_name='Summary', index=False)\r\n\r\n            # Work Activities\r\n            if report.work_activities:\r\n                activities_df = pd.DataFrame([\r\n                    {\r\n                        'Activity ID': a.activity_id,\r\n                        'Description': a.description,\r\n                        'Location': a.location,\r\n                        'Planned': a.planned_qty,\r\n                        'Actual': a.actual_qty,\r\n                        'Unit': a.unit,\r\n                        'Status': a.status.value,\r\n                        'Crew': a.crew_size,\r\n                        'Hours': a.hours_worked,\r\n                        'Notes': a.notes\r\n                    }\r\n                    for a in report.work_activities\r\n                ])\r\n                activities_df.to_excel(writer, sheet_name='Work Activities', index=False)\r\n\r\n            # Labor\r\n            if report.labor:\r\n                labor_df = pd.DataFrame([\r\n                    {\r\n                        'Trade': l.trade,\r\n                        'Company': l.company,\r\n                        'Workers': l.workers,\r\n                        'Hours': l.hours,\r\n                        'Overtime': l.overtime_hours,\r\n                        'Total Hours': l.workers * (l.hours + l.overtime_hours)\r\n                    }\r\n                    for l in report.labor\r\n                ])\r\n                labor_df.to_excel(writer, sheet_name='Labor', index=False)\r\n\r\n            # Equipment\r\n            if report.equipment:\r\n                equip_df = pd.DataFrame([\r\n                    {\r\n                        'Type': e.equipment_type,\r\n                        'ID': e.equipment_id,\r\n                        'Hours': e.hours_used,\r\n                        'Status': e.status,\r\n                        'Operator': e.operator\r\n                    }\r\n                    for e in report.equipment\r\n                ])\r\n                equip_df.to_excel(writer, sheet_name='Equipment', index=False)\r\n\r\n        return output_path\r\n\r\n    def generate_text_report(self, report: DailyReport) -> str:\r\n        \"\"\"Generate text version of report.\"\"\"\r\n\r\n        summary = self.calculate_summary(report)\r\n\r\n        lines = [\r\n            f\"DAILY PROGRESS REPORT\",\r\n            f\"=\" * 50,\r\n            f\"Project: {report.project_name}\",\r\n            f\"Project #: {report.project_number}\",\r\n            f\"Date: {report.report_date}\",\r\n            f\"Prepared by: {report.prepared_by}\",\r\n            f\"\",\r\n            f\"WEATHER CONDITIONS\",\r\n            f\"-\" * 30,\r\n            f\"Conditions: {report.weather.value}\",\r\n            f\"Temperature: {report.temperature_low}°C - {report.temperature_high}°C\",\r\n            f\"\",\r\n            f\"SUMMARY\",\r\n            f\"-\" * 30,\r\n            f\"Total Workers: {summary['total_workers']}\",\r\n            f\"Total Man-hours: {summary['total_manhours']}\",\r\n            f\"Equipment Hours: {summary['equipment_hours']}\",\r\n            f\"Activities Completed: {summary['activities_completed']}\",\r\n            f\"Activities In Progress: {summary['activities_in_progress']}\",\r\n            f\"Activities Delayed: {summary['activities_delayed']}\",\r\n            f\"Safety Incidents: {summary['safety_incidents']}\",\r\n        ]\r\n\r\n        if report.delays:\r\n            lines.extend([f\"\", f\"DELAYS\", f\"-\" * 30])\r\n            for delay in report.delays:\r\n                lines.append(f\"• {delay}\")\r\n\r\n        return \"\\n\".join(lines)\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\nfrom datetime import date\r\n\r\n# Initialize reporter\r\nreporter = DailyProgressReporter(\"Office Tower A\", \"PRJ-2024-001\")\r\n\r\n# Create report\r\nreport = reporter.create_report(\r\n    report_date=date.today(),\r\n    weather=WeatherCondition.CLEAR,\r\n    temp_high=28,\r\n    temp_low=18,\r\n    prepared_by=\"John Smith\"\r\n)\r\n\r\n# Add activities\r\nreporter.add_work_activity(\r\n    report,\r\n    activity_id=\"A-101\",\r\n    description=\"Pour concrete slab Level 3\",\r\n    location=\"Level 3, Zone A\",\r\n    planned_qty=150,\r\n    actual_qty=150,\r\n    unit=\"m3\",\r\n    crew_size=8,\r\n    hours_worked=10\r\n)\r\n\r\n# Add labor\r\nreporter.add_labor(report, \"Concrete\", \"ABC Concrete Co\", 8, 10, 2)\r\n\r\n# Export\r\nreporter.export_to_excel(report, \"daily_report.xlsx\")\r\n```\r\n\r\n## Common Use Cases\r\n\r\n### 1. Generate Text Summary\r\n```python\r\ntext = reporter.generate_text_report(report)\r\nprint(text)\r\n```\r\n\r\n### 2. Track Delays\r\n```python\r\nreport.delays.append(\"Weather delay - rain from 14:00-16:00\")\r\nreport.delays.append(\"Material delivery late by 2 hours\")\r\n```\r\n\r\n### 3. Calculate Metrics\r\n```python\r\nsummary = reporter.calculate_summary(report)\r\nprint(f\"Productivity: {summary['total_manhours']} man-hours\")\r\n```\r\n\r\n## Resources\r\n- **DDC Book**: Chapter 4.1 - Site Data Collection\r\n",{"slug":5,"description":7,"display_name":39},"Daily Progress Report","main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fdatadrivenconstruction\u002Fdaily-progress-report",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add kbarbel640-del\u002Fskills --skill daily-progress-report",{"tool":53,"command":54},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill daily-progress-report",{"tool":56,"command":57},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill daily-progress-report","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fdaily-progress-report\u002FSKILL.md",true,[61],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"_meta.json","REFERENCE","参考文档",310,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fdaily-progress-report\u002F_meta.json",[68,97,126,147,153,173],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":77,"publishedAt":34},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[74],{"categoryNo":75,"categoryName":76,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000036","内容创作者",[78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96],"crowd prompting","prompting","api","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","https","content","ai agents",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":108,"publishedAt":34},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[103],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[109,80,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,85,125],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":135,"publishedAt":34},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[132],{"categoryNo":133,"categoryName":134,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000021","资料检索与研究",[136,137,138,139,140,141,142,81,143,123,125,144,80,145,146],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":148,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":152,"publishedAt":34},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[151],{"categoryNo":133,"categoryName":134,"taxonomyType":106,"taxonomyTypeDesc":107},[139,138,137,136,146,141,142,81,140,123,125,143,144,80,145],{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":34},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[160,161,162,163,164,165,166,167,168,169,170,171,172],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":183,"publishedAt":34},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[179,180],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},{"categoryNo":181,"categoryName":182,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000037","律师与法务",[184,185,186,187,81,188,189,40,190,144,191,192,193,194,195,94,196,197,198],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]