iv_and/pdf_generator.dart
joe a8242c2a7e
Some checks are pending
Flutter CI / build (push) Waiting to run
feat: Invoiceアプリの基本機能を追加
Co-authored-by: aider (ollama_chat/7b) <aider@aider.chat>
2026-01-16 09:35:27 +09:00

67 lines
2.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:pdf/pdf.dart';
import 'package:printing/printing.dart';
class PdfGenerator {
static Future<void> generatePdf(Invoice invoice, List<InvoiceItem> items) async {
final pdf = pw.Document();
pdf.addPage(
pw.Page(
build: (pw.Context context) => pw.Column(
children: [
pw.Text('請求書'),
pw.SizedBox(height: 20),
pw.Text('顧客名: ${invoice.customerId}'), // 後で顧客名に変更
pw.Text('日付: ${invoice.date}'),
pw.SizedBox(height: 20),
pw.Table(
border: pw.TableBorder.all(),
children: [
pw.TableRow(children: [
pw.Text('商品名'),
pw.Text('数量'),
pw.Text('単価'),
pw.Text('値引き'),
pw.Text('小計'),
]),
for (var item in items)
pw.TableRow(children: [
pw.Text(item.productId.toString()), // 後で商品名に変更
pw.Text(item.quantity.toString()),
pw.Text(item.unitPrice.toStringAsFixed(2)),
pw.Text((item.discount * 100).toStringAsFixed(2) + '%'),
pw.Text((item.unitPrice * item.quantity - (item.unitPrice * item.quantity * item.discount)).toStringAsFixed(2)),
]),
],
),
pw.SizedBox(height: 20),
pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('合計'),
pw.Text(invoice.total.toStringAsFixed(2)),
],
),
pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('税額'),
pw.Text(invoice.tax.toStringAsFixed(2)),
],
),
pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text('値引き合計'),
pw.Text(invoice.discountTotal.toStringAsFixed(2)),
],
),
],
),
),
);
await Printing.sharePdf(bytes: pdf.save(), filename: 'invoice.pdf');
}
}