Efril 0917c5132b
Some checks are pending
Build & Deploy iOS to TestFlight / build-and-deploy (push) Waiting to run
feat: update profit loss ui
2026-06-24 10:14:37 +07:00

168 lines
5.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:shimmer/shimmer.dart';
import '../../../../application/analytic/purchasing_analytic_loader/purchasing_analytic_loader_bloc.dart';
import '../../../../common/extension/extension.dart';
import '../../../../common/theme/theme.dart';
import '../../../components/spacer/spacer.dart';
class PurchaseRincianCard extends StatelessWidget {
final PurchasingAnalyticLoaderState state;
const PurchaseRincianCard({super.key, required this.state});
@override
Widget build(BuildContext context) {
if (state.isFetching) return _buildShimmer();
final summary = state.purchasing.summary;
return Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: AppColor.surface,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.04),
blurRadius: 10,
offset: const Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
context.lang.daily_breakdown,
style: AppStyle.xl.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.textPrimary,
fontSize: 18,
),
),
const SpaceHeight(16),
_buildRow('Total Pembelian', summary.totalPurchases.currencyFormatRp),
_buildDivider(),
_buildRow(
'Bahan Baku',
summary.rawMaterialPurchases.currencyFormatRp,
),
_buildDivider(),
_buildRow('Pengeluaran', summary.expensePurchases.currencyFormatRp),
_buildDivider(),
_buildRow('Total PO', '${summary.totalPurchaseOrders} PO'),
_buildDivider(),
_buildRow('Total Qty', '${summary.totalQuantity} pcs'),
_buildDivider(),
_buildRow(
'Rata-rata PO',
summary.averagePurchaseOrderValue.round().currencyFormatRp,
),
_buildDivider(),
_buildRow('Item Bahan Baku', '${summary.totalIngredients} item'),
_buildDivider(),
_buildRow('Vendor', '${summary.totalVendors} vendor'),
],
),
);
}
Widget _buildRow(String label, String value, {bool isBold = false}) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 14),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
label,
style: AppStyle.md.copyWith(
color: isBold ? AppColor.textPrimary : AppColor.textSecondary,
fontWeight: isBold ? FontWeight.w700 : FontWeight.w500,
fontSize: 14,
),
),
Text(
value,
style: AppStyle.md.copyWith(
color: AppColor.textPrimary,
fontWeight: isBold ? FontWeight.w700 : FontWeight.w600,
fontSize: 14,
),
),
],
),
);
}
Widget _buildDivider() {
return Divider(
height: 1,
thickness: 1,
color: AppColor.border.withOpacity(0.5),
);
}
Widget _buildShimmer() {
return Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: AppColor.surface,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.04),
blurRadius: 10,
offset: const Offset(0, 2),
),
],
),
child: Shimmer.fromColors(
baseColor: Colors.grey[300]!,
highlightColor: Colors.grey[100]!,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 140,
height: 20,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
),
const SpaceHeight(20),
...List.generate(
8,
(index) => Padding(
padding: const EdgeInsets.only(bottom: 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
width: 100,
height: 14,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
),
Container(
width: 80,
height: 14,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
),
],
),
),
),
],
),
),
);
}
}