Compare commits

..
2 Commits
Author SHA1 Message Date
Efril 5d73f82017 fix payment struck 2026-01-13 23:41:56 +07:00
aefril 1d52f22f5f Merge pull request 'dev' (#1) from dev into main
Reviewed-on: #1
2025-08-13 17:19:46 +00:00
59 changed files with 1228 additions and 7537 deletions
+1 -1
View File
@@ -45,7 +45,7 @@ android {
applicationId "com.appscale.pos" applicationId "com.appscale.pos"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21 minSdkVersion flutter.minSdkVersion
targetSdkVersion 35 targetSdkVersion 35
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
+1 -2
View File
@@ -70,8 +70,7 @@ class _CustomDatePickerState extends State<CustomDatePicker> {
), ),
decoration: InputDecoration( decoration: InputDecoration(
suffixIcon: Padding( suffixIcon: Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.all(16.0),
vertical: 8, horizontal: 16),
child: Assets.icons.calendar.svg(), child: Assets.icons.calendar.svg(),
), ),
prefix: widget.prefix, prefix: widget.prefix,
-409
View File
@@ -1,409 +0,0 @@
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_datepicker/datepicker.dart';
class DateRangePickerModal {
static Future<DateRangePickerSelectionChangedArgs?> show({
required BuildContext context,
String title = 'Pilih Rentang Tanggal',
DateTime? initialStartDate,
DateTime? initialEndDate,
DateTime? minDate,
DateTime? maxDate,
String confirmText = 'Pilih',
String cancelText = 'Batal',
Color primaryColor = Colors.blue,
Function(DateTime? startDate, DateTime? endDate)? onChanged,
}) async {
return await showDialog<DateRangePickerSelectionChangedArgs?>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) => _DateRangePickerDialog(
title: title,
initialStartDate: initialStartDate,
initialEndDate: initialEndDate,
minDate: minDate,
maxDate: maxDate,
confirmText: confirmText,
cancelText: cancelText,
primaryColor: primaryColor,
onChanged: onChanged,
),
);
}
}
class _DateRangePickerDialog extends StatefulWidget {
final String title;
final DateTime? initialStartDate;
final DateTime? initialEndDate;
final DateTime? minDate;
final DateTime? maxDate;
final String confirmText;
final String cancelText;
final Color primaryColor;
final Function(DateTime? startDate, DateTime? endDate)? onChanged;
const _DateRangePickerDialog({
required this.title,
this.initialStartDate,
this.initialEndDate,
this.minDate,
this.maxDate,
required this.confirmText,
required this.cancelText,
required this.primaryColor,
this.onChanged,
});
@override
State<_DateRangePickerDialog> createState() => _DateRangePickerDialogState();
}
class _DateRangePickerDialogState extends State<_DateRangePickerDialog>
with TickerProviderStateMixin {
DateRangePickerSelectionChangedArgs? _selectionChangedArgs;
late AnimationController _animationController;
late Animation<double> _scaleAnimation;
late Animation<double> _fadeAnimation;
@override
void initState() {
super.initState();
_animationController = AnimationController(
duration: const Duration(milliseconds: 300),
vsync: this,
);
_scaleAnimation = Tween<double>(
begin: 0.8,
end: 1.0,
).animate(CurvedAnimation(
parent: _animationController,
curve: Curves.elasticOut,
));
_fadeAnimation = Tween<double>(
begin: 0.0,
end: 1.0,
).animate(CurvedAnimation(
parent: _animationController,
curve: Curves.easeInOut,
));
_animationController.forward();
}
@override
void dispose() {
_animationController.dispose();
super.dispose();
}
void _onSelectionChanged(DateRangePickerSelectionChangedArgs args) {
setState(() {
_selectionChangedArgs = args;
});
// Note: onChanged callback is now called only when confirm button is pressed
// This allows users to see real-time selection without triggering callbacks
}
String _getSelectionText() {
if (_selectionChangedArgs?.value is PickerDateRange) {
final PickerDateRange range = _selectionChangedArgs!.value;
if (range.startDate != null && range.endDate != null) {
return '${_formatDate(range.startDate!)} - ${_formatDate(range.endDate!)}';
} else if (range.startDate != null) {
return _formatDate(range.startDate!);
}
}
return 'Belum ada tanggal dipilih';
}
String _formatDate(DateTime date) {
final months = [
'Jan',
'Feb',
'Mar',
'Apr',
'Mei',
'Jun',
'Jul',
'Agu',
'Sep',
'Okt',
'Nov',
'Des'
];
return '${date.day} ${months[date.month - 1]} ${date.year}';
}
bool get _isValidSelection {
if (_selectionChangedArgs?.value is PickerDateRange) {
final PickerDateRange range = _selectionChangedArgs!.value;
return range.startDate != null && range.endDate != null;
}
return false;
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _animationController,
builder: (context, child) {
return FadeTransition(
opacity: _fadeAnimation,
child: ScaleTransition(
scale: _scaleAnimation,
child: Dialog(
backgroundColor: Colors.transparent,
elevation: 0,
insetPadding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 24),
child: Container(
width: MediaQuery.of(context).size.width,
constraints: BoxConstraints(
maxWidth: 400,
maxHeight: MediaQuery.of(context).size.height * 0.85,
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.1),
blurRadius: 20,
offset: const Offset(0, 10),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// Header
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
widget.primaryColor,
widget.primaryColor.withOpacity(0.8),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
),
child: Row(
children: [
Icon(
Icons.calendar_today_rounded,
color: Colors.white,
size: 24,
),
const SizedBox(width: 12),
Expanded(
child: Text(
widget.title,
style: const TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
],
),
),
// Scrollable Content
Flexible(
child: SingleChildScrollView(
child: Column(
children: [
// Selection Info
Container(
width: double.infinity,
padding: const EdgeInsets.all(12),
margin: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: widget.primaryColor.withOpacity(0.1),
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: widget.primaryColor.withOpacity(0.2),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Tanggal Terpilih:',
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500,
color: widget.primaryColor,
),
),
const SizedBox(height: 4),
Text(
_getSelectionText(),
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: Colors.black87,
),
),
],
),
),
// Date Picker
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16),
child: Container(
height: 320,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: Colors.grey.withOpacity(0.2),
),
),
child: SfDateRangePicker(
onSelectionChanged: _onSelectionChanged,
selectionMode:
DateRangePickerSelectionMode.range,
initialSelectedRange:
(widget.initialStartDate != null &&
widget.initialEndDate != null)
? PickerDateRange(
widget.initialStartDate,
widget.initialEndDate,
)
: null,
minDate: widget.minDate,
maxDate: widget.maxDate,
startRangeSelectionColor: widget.primaryColor,
endRangeSelectionColor: widget.primaryColor,
rangeSelectionColor:
widget.primaryColor.withOpacity(0.2),
todayHighlightColor: widget.primaryColor,
headerStyle: DateRangePickerHeaderStyle(
backgroundColor: Colors.transparent,
textAlign: TextAlign.center,
textStyle: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
),
monthViewSettings:
DateRangePickerMonthViewSettings(
viewHeaderStyle:
DateRangePickerViewHeaderStyle(
backgroundColor:
Colors.grey.withOpacity(0.1),
textStyle: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
color: widget.primaryColor,
),
),
),
selectionTextStyle: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 14,
),
rangeTextStyle: TextStyle(
color: widget.primaryColor,
fontWeight: FontWeight.w500,
fontSize: 14,
),
),
),
),
],
),
),
),
// Action Buttons
Padding(
padding: const EdgeInsets.all(20),
child: Row(
children: [
Expanded(
child: OutlinedButton(
onPressed: () => Navigator.of(context).pop(),
style: OutlinedButton.styleFrom(
padding:
const EdgeInsets.symmetric(vertical: 14),
side: BorderSide(color: Colors.grey.shade400),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Text(
widget.cancelText,
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: Colors.grey,
),
),
),
),
const SizedBox(width: 16),
Expanded(
child: ElevatedButton(
onPressed: _isValidSelection
? () {
// Call onChanged when confirm button is pressed
if (widget.onChanged != null &&
_selectionChangedArgs?.value
is PickerDateRange) {
final PickerDateRange range =
_selectionChangedArgs!.value;
widget.onChanged!(
range.startDate, range.endDate);
}
Navigator.of(context)
.pop(_selectionChangedArgs);
}
: null,
style: ElevatedButton.styleFrom(
backgroundColor: widget.primaryColor,
padding:
const EdgeInsets.symmetric(vertical: 14),
elevation: 2,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
disabledBackgroundColor: Colors.grey.shade300,
),
child: Text(
widget.confirmText,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: _isValidSelection
? Colors.white
: Colors.grey.shade600,
),
),
),
),
],
),
),
],
),
),
),
),
);
},
);
}
}
+1 -1
View File
@@ -2,6 +2,6 @@ class Variables {
static const String appName = 'POS Kasir Resto App'; static const String appName = 'POS Kasir Resto App';
static const String apiVersion = 'v1'; static const String apiVersion = 'v1';
// static const String baseUrl = 'http://192.168.1.202:8000'; // static const String baseUrl = 'http://192.168.1.202:8000';
static const String baseUrl = 'https://api-pos.apskel.id'; static const String baseUrl = 'https://enaklo-pos-be.altru.id';
static const int defaultLimit = 10; static const int defaultLimit = 10;
} }
+19 -73
View File
@@ -35,25 +35,18 @@ Future<void> onPrint(
// Checker printer // Checker printer
if (checkerPrinter != null) { if (checkerPrinter != null) {
try { try {
final productByPrinter = productQuantity
.where((item) => item.product.printerType == 'checker')
.toList();
final printValue = await PrintDataoutputs.instance.printChecker( final printValue = await PrintDataoutputs.instance.printChecker(
productByPrinter, productQuantity,
order.tableNumber ?? "", order.tableNumber ?? "",
order.orderNumber ?? "", order.orderNumber ?? "",
authData.user?.name ?? "", authData.user?.name ?? "",
order.metadata?['customer_name'] ?? "",
checkerPrinter.paper.toIntegerFromText, checkerPrinter.paper.toIntegerFromText,
order.orderType ?? "", order.orderType ?? "",
); );
if (productByPrinter.isNotEmpty) { await PrinterService()
await PrinterService() // ignore: use_build_context_synchronously
// ignore: use_build_context_synchronously .printWithPrinter(checkerPrinter, printValue, context);
.printWithPrinter(checkerPrinter, printValue, context);
}
} catch (e) { } catch (e) {
log("Error printing checker: $e"); log("Error printing checker: $e");
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
@@ -65,23 +58,17 @@ Future<void> onPrint(
// Kitchen printer // Kitchen printer
if (kitchenPrinter != null) { if (kitchenPrinter != null) {
try { try {
final productByPrinter = productQuantity
.where((item) => item.product.printerType == 'kitchen')
.toList();
final printValue = await PrintDataoutputs.instance.printKitchen( final printValue = await PrintDataoutputs.instance.printKitchen(
productByPrinter, productQuantity,
order.tableNumber!, order.tableNumber!,
order.orderNumber ?? "", order.orderNumber ?? "",
authData.user?.name ?? "", authData.user?.name ?? "",
order.metadata?['customer_name'] ?? "",
kitchenPrinter.paper.toIntegerFromText, kitchenPrinter.paper.toIntegerFromText,
order.orderType ?? "", order.orderType ?? "",
); );
if (productByPrinter.isNotEmpty) { await PrinterService()
await PrinterService() .printWithPrinter(kitchenPrinter, printValue, context);
.printWithPrinter(kitchenPrinter, printValue, context);
}
} catch (e) { } catch (e) {
log("Error printing kitchen order: $e"); log("Error printing kitchen order: $e");
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
@@ -93,24 +80,17 @@ Future<void> onPrint(
// Bar printer // Bar printer
if (barPrinter != null) { if (barPrinter != null) {
try { try {
final productByPrinter = productQuantity
.where((item) => item.product.printerType == 'bar')
.toList();
final printValue = await PrintDataoutputs.instance.printBar( final printValue = await PrintDataoutputs.instance.printBar(
productByPrinter, productQuantity,
order.tableNumber ?? "", order.tableNumber ?? "",
order.orderNumber ?? "", order.orderNumber ?? "",
authData.user?.name ?? "", authData.user?.name ?? "",
order.metadata?['customer_name'] ?? "",
barPrinter.paper.toIntegerFromText, barPrinter.paper.toIntegerFromText,
order.orderType ?? "", order.orderType ?? "",
); );
if (productByPrinter.isNotEmpty) { await PrinterService()
await PrinterService() .printWithPrinter(barPrinter, printValue, context);
.printWithPrinter(barPrinter, printValue, context);
}
} catch (e) { } catch (e) {
log("Error printing bar order: $e"); log("Error printing bar order: $e");
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
@@ -153,7 +133,6 @@ Future<void> onPrintRecipt(
required String paymentMethod, required String paymentMethod,
required int nominalBayar, required int nominalBayar,
required int kembalian, required int kembalian,
required List<ProductQuantity> productQuantity,
}) async { }) async {
final receiptPrinter = final receiptPrinter =
await ProductLocalDatasource.instance.getPrinterByCode('receipt'); await ProductLocalDatasource.instance.getPrinterByCode('receipt');
@@ -164,49 +143,16 @@ Future<void> onPrintRecipt(
if (receiptPrinter != null) { if (receiptPrinter != null) {
try { try {
final printValue = await PrintDataoutputs.instance.printOrderV4( final printValue = await PrintDataoutputs.instance.printOrderV4(
order, order,
authData.user?.name ?? "", authData.user?.name ?? "",
paymentMethod, paymentMethod,
nominalBayar, nominalBayar,
kembalian, kembalian,
settings.value, settings.value,
receiptPrinter.paper.toIntegerFromText, receiptPrinter.paper.toIntegerFromText,
order.orderType ?? "", order.orderType ?? "",
outlet, outlet,
productQuantity);
await PrinterService()
.printWithPrinter(receiptPrinter, printValue, context);
} catch (e) {
log("Error printing receipt order: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error printing receipt order: $e')),
); );
}
}
}
Future<void> onPrinVoidRecipt(
context, {
required Order order,
required List<OrderItem> productItemVoid,
required int totalVoid,
}) async {
final receiptPrinter =
await ProductLocalDatasource.instance.getPrinterByCode('receipt');
final authData = await AuthLocalDataSource().getAuthData();
final settings = await SettingsLocalDatasource().getTax();
final outlet = await OutletLocalDatasource().get();
if (receiptPrinter != null) {
try {
final printValue = await PrintDataoutputs.instance.printVoidOrder(
order,
authData.user?.name ?? "",
settings.value,
receiptPrinter.paper.toIntegerFromText,
totalVoid,
outlet,
productItemVoid);
await PrinterService() await PrinterService()
.printWithPrinter(receiptPrinter, printValue, context); .printWithPrinter(receiptPrinter, printValue, context);
} catch (e) { } catch (e) {
-568
View File
@@ -1,568 +0,0 @@
import 'dart:io';
import 'package:enaklo_pos/core/utils/helper_pdf_service.dart';
import 'package:enaklo_pos/data/datasources/outlet_local_datasource.dart';
import 'package:enaklo_pos/data/models/response/inventory_analytic_response_model.dart';
import 'package:flutter/services.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
class InventoryReport {
static final primaryColor = PdfColor.fromHex("36175e");
static Future<File> previewPdf({
required String searchDateFormatted,
required InventoryAnalyticData? inventory,
}) async {
final pdf = pw.Document();
final ByteData dataImage = await rootBundle.load('assets/logo/logo.png');
final Uint8List bytes = dataImage.buffer.asUint8List();
final outlet = await OutletLocalDatasource().get();
final image = pw.MemoryImage(bytes);
pdf.addPage(
pw.MultiPage(
pageFormat: PdfPageFormat.a4,
margin: pw.EdgeInsets.zero,
build: (pw.Context context) {
return [
pw.Container(
padding: pw.EdgeInsets.all(20),
child: pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
// Bagian kiri - Logo dan Info Perusahaan
pw.Row(
crossAxisAlignment: pw.CrossAxisAlignment.center,
children: [
// Icon/Logo placeholder (bisa diganti dengan gambar logo)
pw.Container(
width: 40,
height: 40,
child: pw.Image(image),
),
pw.SizedBox(width: 15),
pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
pw.Text(
'Apskel',
style: pw.TextStyle(
fontSize: 28,
fontWeight: pw.FontWeight.bold,
color: primaryColor,
),
),
pw.SizedBox(height: 4),
pw.Text(
outlet.name ?? "",
style: pw.TextStyle(
fontSize: 16,
color: PdfColors.grey700,
),
),
pw.SizedBox(height: 2),
pw.Text(
outlet.address ?? "",
style: pw.TextStyle(
fontSize: 12,
color: PdfColors.grey600,
),
),
],
),
],
),
// Bagian kanan - Info Laporan
pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.end,
children: [
pw.Text(
'Laporan Transaksi',
style: pw.TextStyle(
fontSize: 24,
fontWeight: pw.FontWeight.bold,
color: PdfColors.grey800,
),
),
pw.SizedBox(height: 8),
pw.Text(
searchDateFormatted,
style: pw.TextStyle(
fontSize: 14,
color: PdfColors.grey600,
),
),
pw.SizedBox(height: 4),
pw.Text(
'Laporan',
style: pw.TextStyle(
fontSize: 12,
color: PdfColors.grey500,
),
),
],
),
],
),
),
pw.Container(
width: double.infinity,
height: 3,
color: primaryColor,
),
// Summary
pw.Container(
padding: pw.EdgeInsets.all(20),
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSectionWidget('1. Ringkasan'),
pw.SizedBox(height: 30),
pw.Row(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
pw.Expanded(
flex: 1,
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSummaryItem(
'Total Item',
(inventory?.summary.totalProducts ?? 0)
.toString(),
),
_buildSummaryItem(
'Total Item Masuk',
(inventory?.products.fold<num>(
0,
(sum, item) =>
sum + (item.totalIn)) ??
0)
.toString(),
),
_buildSummaryItem(
'Total Item Keluar',
(inventory?.products.fold<num>(0,
(sum, item) => sum + (item.totalOut)))
.toString(),
),
],
),
),
pw.SizedBox(width: 20),
pw.Expanded(
flex: 1,
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSummaryItem(
'Total Ingredient',
(inventory?.summary.totalIngredients ?? 0)
.toString(),
),
_buildSummaryItem(
'Total Ingredient Masuk',
(inventory?.ingredients.fold<num>(
0,
(sum, item) =>
sum + (item.totalIn)) ??
0)
.toString(),
),
_buildSummaryItem(
'Total Ingredient Keluar',
(inventory?.ingredients.fold<num>(
0,
(sum, item) =>
sum + (item.totalOut)) ??
0)
.toString(),
),
],
),
),
],
),
],
),
),
// Summary Item
pw.Container(
padding: pw.EdgeInsets.all(20),
child: pw.Column(
children: [
pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSectionWidget('2. Item'),
pw.SizedBox(height: 30),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
topLeft: pw.Radius.circular(8),
topRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(2), // Kategori
2: pw.FlexColumnWidth(1), // Stock
3: pw.FlexColumnWidth(2), // Masuk
4: pw.FlexColumnWidth(2), // Keluar
},
children: [
pw.TableRow(
children: [
_buildHeaderCell('Nama'),
_buildHeaderCell('Kategori'),
_buildHeaderCell('Stock'),
_buildHeaderCell('Masuk'),
_buildHeaderCell('Keluar'),
],
),
],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: PdfColors.white,
),
child: pw.Table(
columnWidths: {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(2), // Kategori
2: pw.FlexColumnWidth(1), // Stock
3: pw.FlexColumnWidth(2), // Masuk
4: pw.FlexColumnWidth(2), // Keluar
},
children: inventory?.products
.map((item) => _buildProductDataRow(
item,
inventory.products.indexOf(item) %
2 ==
0,
))
.toList() ??
[],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
bottomLeft: pw.Radius.circular(8),
bottomRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(2), // Kategori
2: pw.FlexColumnWidth(1), // Stock
3: pw.FlexColumnWidth(2), // Masuk
4: pw.FlexColumnWidth(2), // Keluar
},
children: [
pw.TableRow(
children: [
_buildTotalCell('TOTAL'),
_buildTotalCell(''),
_buildTotalCell(
(inventory?.products.fold<num>(
0,
(sum, item) =>
sum + (item.quantity)) ??
0)
.toString(),
),
_buildTotalCell(
(inventory?.products.fold<num>(
0,
(sum, item) =>
sum + (item.totalIn)) ??
0)
.toString(),
),
_buildTotalCell(
(inventory?.products.fold<num>(
0,
(sum, item) =>
sum + (item.totalOut)) ??
0)
.toString(),
),
],
),
],
),
),
],
),
],
),
),
// Summary Ingredient
pw.Container(
padding: pw.EdgeInsets.all(20),
child: pw.Column(
children: [
pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSectionWidget('3. Ingredient'),
pw.SizedBox(height: 30),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
topLeft: pw.Radius.circular(8),
topRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Name
1: pw.FlexColumnWidth(1), // Stock
2: pw.FlexColumnWidth(2), // Masuk
3: pw.FlexColumnWidth(2), // Keluar
},
children: [
pw.TableRow(
children: [
_buildHeaderCell('Nama'),
_buildHeaderCell('Stock'),
_buildHeaderCell('Masuk'),
_buildHeaderCell('Keluar'),
],
),
],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: PdfColors.white,
),
child: pw.Table(
columnWidths: {
0: pw.FlexColumnWidth(2.5), // Name
1: pw.FlexColumnWidth(1), // Stock
2: pw.FlexColumnWidth(2), // Masuk
3: pw.FlexColumnWidth(2), // Keluar
},
children: inventory?.ingredients
.map((item) => _buildIngredientsDataRow(
item,
inventory.ingredients.indexOf(item) %
2 ==
0,
))
.toList() ??
[],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
bottomLeft: pw.Radius.circular(8),
bottomRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Name
1: pw.FlexColumnWidth(1), // Stock
2: pw.FlexColumnWidth(2), // Masuk
3: pw.FlexColumnWidth(2), // Keluar
},
children: [
pw.TableRow(
children: [
_buildTotalCell('TOTAL'),
_buildTotalCell(
(inventory?.ingredients.fold<num>(
0,
(sum, item) =>
sum + (item.quantity)) ??
0)
.toString(),
),
_buildTotalCell(
(inventory?.ingredients.fold<num>(
0,
(sum, item) =>
sum + (item.totalIn)) ??
0)
.toString(),
),
_buildTotalCell(
(inventory?.ingredients.fold<num>(
0,
(sum, item) =>
sum + (item.totalOut)) ??
0)
.toString(),
),
],
),
],
),
),
],
),
],
),
),
];
}),
);
return HelperPdfService.saveDocument(
name:
'Apskel POS | Inventory Report | ${DateTime.now().millisecondsSinceEpoch}.pdf',
pdf: pdf);
}
static pw.Widget _buildSectionWidget(String title) {
return pw.Text(
title,
style: pw.TextStyle(
fontSize: 20,
fontWeight: pw.FontWeight.bold,
color: primaryColor,
),
);
}
static pw.Widget _buildSummaryItem(
String label,
String value, {
pw.TextStyle? valueStyle,
pw.TextStyle? labelStyle,
}) {
return pw.Container(
padding: pw.EdgeInsets.only(bottom: 8),
margin: pw.EdgeInsets.only(bottom: 16),
decoration: pw.BoxDecoration(
border: pw.Border(
bottom: pw.BorderSide(
color: PdfColors.grey300,
),
),
),
child: pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text(label, style: labelStyle),
pw.Text(
value,
style: valueStyle ??
pw.TextStyle(
fontWeight: pw.FontWeight.bold,
),
),
],
),
);
}
static pw.Widget _buildHeaderCell(String text) {
return pw.Container(
padding: pw.EdgeInsets.symmetric(horizontal: 12, vertical: 16),
child: pw.Text(
text,
style: pw.TextStyle(
color: PdfColors.white,
fontWeight: pw.FontWeight.bold,
fontSize: 12,
),
textAlign: pw.TextAlign.center,
),
);
}
static pw.Widget _buildDataCell(String text,
{pw.Alignment alignment = pw.Alignment.center, PdfColor? textColor}) {
return pw.Container(
padding: pw.EdgeInsets.symmetric(horizontal: 12, vertical: 16),
alignment: alignment,
child: pw.Text(
text,
style: pw.TextStyle(
fontSize: 12,
color: textColor ?? PdfColors.black,
fontWeight: pw.FontWeight.normal,
),
textAlign: alignment == pw.Alignment.centerLeft
? pw.TextAlign.left
: pw.TextAlign.center,
),
);
}
static pw.Widget _buildTotalCell(String text) {
return pw.Container(
padding: pw.EdgeInsets.symmetric(horizontal: 12, vertical: 16),
child: pw.Text(
text,
style: pw.TextStyle(
color: PdfColors.white,
fontWeight: pw.FontWeight.bold,
fontSize: 12,
),
textAlign: pw.TextAlign.center,
),
);
}
static pw.TableRow _buildProductDataRow(
InventoryProductItem product, bool isEven) {
return pw.TableRow(
decoration: pw.BoxDecoration(
color: product.isZeroStock
? PdfColors.red100
: product.isLowStock
? PdfColors.yellow100
: isEven
? PdfColors.grey50
: PdfColors.white,
),
children: [
_buildDataCell(product.productName, alignment: pw.Alignment.centerLeft),
_buildDataCell(product.categoryName,
alignment: pw.Alignment.centerLeft),
_buildDataCell(product.quantity.toString()),
_buildDataCell(product.totalIn.toString()),
_buildDataCell(product.totalOut.toString()),
],
);
}
static pw.TableRow _buildIngredientsDataRow(
InventoryIngredientItem item, bool isEven) {
return pw.TableRow(
decoration: pw.BoxDecoration(
color: item.isZeroStock
? PdfColors.red100
: item.isLowStock
? PdfColors.yellow100
: isEven
? PdfColors.grey50
: PdfColors.white,
),
children: [
_buildDataCell(item.ingredientName, alignment: pw.Alignment.centerLeft),
_buildDataCell(item.quantity.toString()),
_buildDataCell(item.totalIn.toString()),
_buildDataCell(item.totalOut.toString()),
],
);
}
}
-912
View File
@@ -1,912 +0,0 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:enaklo_pos/core/extensions/string_ext.dart';
import 'package:enaklo_pos/core/utils/helper_pdf_service.dart';
import 'package:enaklo_pos/data/models/response/category_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/payment_method_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/product_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/profit_loss_response_model.dart';
import 'package:enaklo_pos/presentation/home/models/outlet_model.dart';
import 'package:flutter/services.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
class TransactionReport {
static final primaryColor = PdfColor.fromHex("36175e");
static Future<File> previewPdf({
required Outlet outlet,
required String searchDateFormatted,
required CategoryAnalyticData? categoryAnalyticData,
required ProfitLossData? profitLossData,
required PaymentMethodAnalyticData? paymentMethodAnalyticData,
required ProductAnalyticData? productAnalyticData,
}) async {
final pdf = pw.Document();
final ByteData dataImage = await rootBundle.load('assets/logo/logo.png');
final Uint8List bytes = dataImage.buffer.asUint8List();
final profitLossProductSummary = {
'totalRevenue': profitLossData?.productData
.fold<num>(0, (sum, item) => sum + (item.revenue)) ??
0,
'totalCost': profitLossData?.productData
.fold<num>(0, (sum, item) => sum + (item.cost)) ??
0,
'totalGrossProfit': profitLossData?.productData
.fold<num>(0, (sum, item) => sum + (item.grossProfit)) ??
0,
'totalQuantity': profitLossData?.productData
.fold<num>(0, (sum, item) => sum + (item.quantitySold)) ??
0,
};
final categorySummary = {
'totalRevenue': categoryAnalyticData?.data
.fold<num>(0, (sum, item) => sum + (item.totalRevenue)) ??
0,
'orderCount': categoryAnalyticData?.data
.fold<num>(0, (sum, item) => sum + (item.orderCount)) ??
0,
'productCount': categoryAnalyticData?.data
.fold<num>(0, (sum, item) => sum + (item.productCount)) ??
0,
'totalQuantity': categoryAnalyticData?.data
.fold<num>(0, (sum, item) => sum + (item.totalQuantity)) ??
0,
};
final productItemSummary = {
'totalRevenue': productAnalyticData?.data
.fold<num>(0, (sum, item) => sum + (item.revenue)) ??
0,
'orderCount': productAnalyticData?.data
.fold<num>(0, (sum, item) => sum + (item.orderCount)) ??
0,
'totalQuantitySold': productAnalyticData?.data
.fold<num>(0, (sum, item) => sum + (item.quantitySold)) ??
0,
};
// Membuat objek Image dari gambar
final image = pw.MemoryImage(bytes);
pdf.addPage(
pw.MultiPage(
pageFormat: PdfPageFormat.a4,
margin: pw.EdgeInsets.zero,
build: (pw.Context context) {
return [
pw.Container(
padding: pw.EdgeInsets.all(20),
child: pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
// Bagian kiri - Logo dan Info Perusahaan
pw.Row(
crossAxisAlignment: pw.CrossAxisAlignment.center,
children: [
// Icon/Logo placeholder (bisa diganti dengan gambar logo)
pw.Container(
width: 40,
height: 40,
child: pw.Image(image),
),
pw.SizedBox(width: 15),
pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
pw.Text(
'Apskel',
style: pw.TextStyle(
fontSize: 28,
fontWeight: pw.FontWeight.bold,
color: primaryColor,
),
),
pw.SizedBox(height: 4),
pw.Text(
outlet.name ?? "",
style: pw.TextStyle(
fontSize: 16,
color: PdfColors.grey700,
),
),
pw.SizedBox(height: 2),
pw.Text(
outlet.address ?? "",
style: pw.TextStyle(
fontSize: 12,
color: PdfColors.grey600,
),
),
],
),
],
),
// Bagian kanan - Info Laporan
pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.end,
children: [
pw.Text(
'Laporan Transaksi',
style: pw.TextStyle(
fontSize: 24,
fontWeight: pw.FontWeight.bold,
color: PdfColors.grey800,
),
),
pw.SizedBox(height: 8),
pw.Text(
searchDateFormatted,
style: pw.TextStyle(
fontSize: 14,
color: PdfColors.grey600,
),
),
pw.SizedBox(height: 4),
pw.Text(
'Laporan',
style: pw.TextStyle(
fontSize: 12,
color: PdfColors.grey500,
),
),
],
),
],
),
),
pw.Container(
width: double.infinity,
height: 3,
color: primaryColor,
),
// Summary
pw.Container(
padding: pw.EdgeInsets.all(20),
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSectionWidget('1. Ringkasan'),
pw.SizedBox(height: 30),
pw.Row(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
pw.Expanded(
flex: 1,
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSummaryItem(
'Total Penjualan (termasuk rasik)',
(profitLossData?.summary.totalRevenue ?? 0)
.toString()
.currencyFormatRpV2,
),
_buildSummaryItem(
'Total Terjual',
(profitLossData?.summary.totalOrders ?? 0)
.toString(),
),
_buildSummaryItem(
'HPP',
'${(profitLossData?.summary.totalCost ?? 0).toString().currencyFormatRpV2} | ${(((profitLossData?.summary.totalCost ?? 0) / (profitLossData?.summary.totalRevenue ?? 1)) * 100).round()}%',
),
_buildSummaryItem(
'Laba Kotor',
'${(profitLossData?.summary.grossProfit ?? 0).toString().currencyFormatRpV2} | ${(profitLossData?.summary.grossProfitMargin ?? 0).round()}%',
valueStyle: pw.TextStyle(
color: PdfColors.green800,
fontWeight: pw.FontWeight.bold,
fontSize: 16,
),
labelStyle: pw.TextStyle(
color: PdfColors.green800,
fontWeight: pw.FontWeight.bold,
fontSize: 16,
),
),
],
),
),
pw.SizedBox(width: 20),
pw.Expanded(
flex: 1,
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSummaryItem(
'Biaya Lain lain',
'${(profitLossData?.summary.totalTax ?? 0).toString().currencyFormatRpV2} | ${(((profitLossData?.summary.totalTax ?? 0) / (profitLossData?.summary.totalRevenue ?? 1)) * 100).round()}%',
),
_buildSummaryItem(
'Laba/Rugi',
'${(profitLossData?.summary.netProfit ?? 0).toString().currencyFormatRpV2} | ${(profitLossData?.summary.netProfitMargin ?? 0).round()}%',
valueStyle: pw.TextStyle(
color: PdfColors.blue800,
fontWeight: pw.FontWeight.bold,
fontSize: 16,
),
labelStyle: pw.TextStyle(
color: PdfColors.blue800,
fontWeight: pw.FontWeight.bold,
fontSize: 16,
),
),
],
),
),
],
),
pw.SizedBox(height: 16),
pw.Text(
"Laba Rugi Perproduk",
style: pw.TextStyle(
fontSize: 16,
fontWeight: pw.FontWeight.bold,
color: primaryColor,
),
),
pw.SizedBox(height: 20),
pw.Column(
children: [
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
topLeft: pw.Radius.circular(8),
topRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(1), // Qty
2: pw.FlexColumnWidth(2.5), // Pendapatan
3: pw.FlexColumnWidth(2), // HPP
4: pw.FlexColumnWidth(2), // Laba Kotor
5: pw.FlexColumnWidth(2), // Margin (%)
},
children: [
pw.TableRow(
children: [
_buildHeaderCell('Produk'),
_buildHeaderCell('Qty'),
_buildHeaderCell('Pendapatan'),
_buildHeaderCell('HPP'),
_buildHeaderCell('Laba Kotor'),
_buildHeaderCell('Margin (%)'),
],
),
],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: PdfColors.white,
),
child: pw.Table(
columnWidths: {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(1), // Qty
2: pw.FlexColumnWidth(2.5), // Pendapatan
3: pw.FlexColumnWidth(2), // HPP
4: pw.FlexColumnWidth(2), // Laba Kotor
5: pw.FlexColumnWidth(2), // Margin (%)
},
children: profitLossData?.productData
.map(
(profitLoss) => _buildPerProductDataRow(
product: profitLoss.productName,
qty: profitLoss.quantitySold.toString(),
pendapatan: profitLoss.revenue
.toString()
.currencyFormatRpV2,
hpp: profitLoss.cost
.toString()
.currencyFormatRpV2,
labaKotor: profitLoss.grossProfit
.toString()
.currencyFormatRpV2,
margin:
'${profitLoss.grossProfitMargin.round()}%',
isEven: profitLossData.productData
.indexOf(profitLoss) %
2 ==
0,
),
)
.toList() ??
[],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
bottomLeft: pw.Radius.circular(8),
bottomRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(1), // Qty
2: pw.FlexColumnWidth(2.5), // Pendapatan
3: pw.FlexColumnWidth(2), // HPP
4: pw.FlexColumnWidth(2), // Laba Kotor
5: pw.FlexColumnWidth(2), // Margin (%)
},
children: [
pw.TableRow(
children: [
_buildTotalCell('TOTAL'),
_buildTotalCell(
profitLossProductSummary['totalQuantity']
.toString()),
_buildTotalCell(
profitLossProductSummary['totalRevenue']
.toString()
.currencyFormatRpV2),
_buildTotalCell(
profitLossProductSummary['totalCost']
.toString()
.currencyFormatRpV2),
_buildTotalCell(
profitLossProductSummary['totalGrossProfit']
.toString()
.currencyFormatRpV2),
_buildTotalCell(''),
],
),
],
),
),
],
),
],
),
),
// Summary Payment Method
pw.Container(
padding: pw.EdgeInsets.all(20),
child: pw.Column(
children: [
pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSectionWidget('2. Ringkasan Metode Pembayaran'),
pw.SizedBox(height: 30),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
topLeft: pw.Radius.circular(8),
topRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Nama
1: pw.FlexColumnWidth(1), // Tipe
2: pw.FlexColumnWidth(2.5), // Jumlah Order
3: pw.FlexColumnWidth(2), // Total Amount
4: pw.FlexColumnWidth(2), // Presentase
},
children: [
pw.TableRow(
children: [
_buildHeaderCell('Nama'),
_buildHeaderCell('Tipe'),
_buildHeaderCell('Jumlah Order'),
_buildHeaderCell('Total Amount'),
_buildHeaderCell('Presentase'),
],
),
],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: PdfColors.white,
),
child: pw.Table(
columnWidths: {
0: pw.FlexColumnWidth(2.5), // Nama
1: pw.FlexColumnWidth(1), // Tipe
2: pw.FlexColumnWidth(2.5), // Jumlah Order
3: pw.FlexColumnWidth(2), // Total Amount
4: pw.FlexColumnWidth(2), // Presentase
},
children: paymentMethodAnalyticData?.data
.map(
(payment) => _buildPaymentMethodDataRow(
name: payment.paymentMethodName,
tipe: payment.paymentMethodType
.toTitleCase(),
jumlahOrder:
payment.orderCount.toString(),
totalAmount: payment.totalAmount
.toString()
.currencyFormatRpV2,
presentase:
'${payment.percentage.round()}%',
isEven: paymentMethodAnalyticData.data
.indexOf(payment) %
2 ==
0,
),
)
.toList() ??
[],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
bottomLeft: pw.Radius.circular(8),
bottomRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(1), // Qty
2: pw.FlexColumnWidth(2.5), // Pendapatan
3: pw.FlexColumnWidth(2), // HPP
4: pw.FlexColumnWidth(2), // Laba Kotor
5: pw.FlexColumnWidth(2), // Margin (%)
},
children: [
pw.TableRow(
children: [
_buildTotalCell('TOTAL'),
_buildTotalCell(''),
_buildTotalCell((paymentMethodAnalyticData
?.summary.totalOrders ??
0)
.toString()),
_buildTotalCell((paymentMethodAnalyticData
?.summary.totalAmount ??
0)
.toString()
.currencyFormatRpV2),
_buildTotalCell(''),
],
),
],
),
),
],
),
],
),
),
// Summary Category
pw.Container(
padding: pw.EdgeInsets.all(20),
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSectionWidget('3. Ringkasan Kategori'),
pw.SizedBox(height: 30),
pw.Column(
children: [
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
topLeft: pw.Radius.circular(8),
topRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Nama
1: pw.FlexColumnWidth(2), // Total Product
2: pw.FlexColumnWidth(1), // qty
3: pw.FlexColumnWidth(2), // Jumlah Order
4: pw.FlexColumnWidth(2.5), // Presentase
},
children: [
pw.TableRow(
children: [
_buildHeaderCell('Nama'),
_buildHeaderCell('Total Produk'),
_buildHeaderCell('Qty'),
_buildHeaderCell('Jumlah Order'),
_buildHeaderCell('Pendapatan'),
],
),
],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: PdfColors.white,
),
child: pw.Table(
columnWidths: {
0: pw.FlexColumnWidth(2.5), // Nama
1: pw.FlexColumnWidth(2), // Total Product
2: pw.FlexColumnWidth(1), // qty
3: pw.FlexColumnWidth(2), // Jumlah Order
4: pw.FlexColumnWidth(2.5), // Presentase
},
children: categoryAnalyticData?.data
.map((category) => _buildCategoryDataRow(
name: category.categoryName,
totalProduct:
category.productCount.toString(),
qty: category.totalQuantity.toString(),
jumlahOrder:
category.orderCount.toString(),
pendapatan: category.totalRevenue
.toString()
.currencyFormatRpV2,
isEven: categoryAnalyticData.data
.indexOf(category) %
2 ==
0,
))
.toList() ??
[],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
bottomLeft: pw.Radius.circular(8),
bottomRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Nama
1: pw.FlexColumnWidth(2), // Total Product
2: pw.FlexColumnWidth(1), // qty
3: pw.FlexColumnWidth(2), // Jumlah Order
4: pw.FlexColumnWidth(2.5), // Presentase
},
children: [
pw.TableRow(
children: [
_buildTotalCell('TOTAL'),
_buildTotalCell(
categorySummary['productCount'].toString()),
_buildTotalCell(categorySummary['totalQuantity']
.toString()),
_buildTotalCell(
categorySummary['orderCount'].toString()),
_buildTotalCell(categorySummary['totalRevenue']
.toString()
.currencyFormatRpV2),
],
),
],
),
),
],
),
],
),
),
// Summary Item
pw.Container(
padding: pw.EdgeInsets.all(20),
child: pw.Column(
children: [
pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
_buildSectionWidget('4. Ringkasan Item'),
pw.SizedBox(height: 30),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
topLeft: pw.Radius.circular(8),
topRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(2), // Kategori
2: pw.FlexColumnWidth(1), // qty
3: pw.FlexColumnWidth(2), // Order
4: pw.FlexColumnWidth(2), // Pendapatan
5: pw.FlexColumnWidth(2), // Average
},
children: [
pw.TableRow(
children: [
_buildHeaderCell('Produk'),
_buildHeaderCell('Kategori'),
_buildHeaderCell('Qty'),
_buildHeaderCell('Order'),
_buildHeaderCell('Pendapatan'),
_buildHeaderCell('Rata Rata'),
],
),
],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: PdfColors.white,
),
child: pw.Table(
columnWidths: {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(2), // Kategori
2: pw.FlexColumnWidth(1), // qty
3: pw.FlexColumnWidth(2), // Order
4: pw.FlexColumnWidth(2), // Pendapatan
5: pw.FlexColumnWidth(2), // Average
},
children: productAnalyticData?.data
.map((item) => _buildItemDataRow(
product: item.productName,
category: item.categoryName,
qty: item.quantitySold.toString(),
order: item.orderCount.toString(),
pendapatan: item.revenue
.toString()
.currencyFormatRpV2,
average: item.averagePrice
.round()
.toString()
.currencyFormatRpV2,
isEven: productAnalyticData.data
.indexOf(item) %
2 ==
0,
))
.toList() ??
[],
),
),
pw.Container(
decoration: pw.BoxDecoration(
color: primaryColor, // Purple color
borderRadius: pw.BorderRadius.only(
bottomLeft: pw.Radius.circular(8),
bottomRight: pw.Radius.circular(8),
),
),
child: pw.Table(
columnWidths: const {
0: pw.FlexColumnWidth(2.5), // Produk
1: pw.FlexColumnWidth(2), // Kategori
2: pw.FlexColumnWidth(1), // qty
3: pw.FlexColumnWidth(2), // Order
4: pw.FlexColumnWidth(2), // Pendapatan
5: pw.FlexColumnWidth(2), // Average
},
children: [
pw.TableRow(
children: [
_buildTotalCell('TOTAL'),
_buildTotalCell(''),
_buildTotalCell(
productItemSummary['totalQuantitySold']
.toString()),
_buildTotalCell(productItemSummary['orderCount']
.toString()),
_buildTotalCell(
productItemSummary['totalRevenue']
.toString()
.currencyFormatRpV2),
_buildTotalCell(''),
],
),
],
),
),
],
),
],
),
),
];
},
),
);
return HelperPdfService.saveDocument(
name: 'Laporan Transaksi | $searchDateFormatted.pdf', pdf: pdf);
}
static pw.Widget _buildSectionWidget(String title) {
return pw.Text(
title,
style: pw.TextStyle(
fontSize: 20,
fontWeight: pw.FontWeight.bold,
color: primaryColor,
),
);
}
static pw.Widget _buildSummaryItem(
String label,
String value, {
pw.TextStyle? valueStyle,
pw.TextStyle? labelStyle,
}) {
return pw.Container(
padding: pw.EdgeInsets.only(bottom: 8),
margin: pw.EdgeInsets.only(bottom: 16),
decoration: pw.BoxDecoration(
border: pw.Border(
bottom: pw.BorderSide(
color: PdfColors.grey300,
),
),
),
child: pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text(label, style: labelStyle),
pw.Text(
value,
style: valueStyle ??
pw.TextStyle(
fontWeight: pw.FontWeight.bold,
),
),
],
),
);
}
static pw.Widget _buildHeaderCell(String text) {
return pw.Container(
padding: pw.EdgeInsets.symmetric(horizontal: 12, vertical: 16),
child: pw.Text(
text,
style: pw.TextStyle(
color: PdfColors.white,
fontWeight: pw.FontWeight.bold,
fontSize: 12,
),
textAlign: pw.TextAlign.center,
),
);
}
static pw.Widget _buildDataCell(String text,
{pw.Alignment alignment = pw.Alignment.center, PdfColor? textColor}) {
return pw.Container(
padding: pw.EdgeInsets.symmetric(horizontal: 12, vertical: 16),
alignment: alignment,
child: pw.Text(
text,
style: pw.TextStyle(
fontSize: 12,
color: textColor ?? PdfColors.black,
fontWeight: pw.FontWeight.normal,
),
textAlign: alignment == pw.Alignment.centerLeft
? pw.TextAlign.left
: pw.TextAlign.center,
),
);
}
static pw.Widget _buildTotalCell(String text) {
return pw.Container(
padding: pw.EdgeInsets.symmetric(horizontal: 12, vertical: 16),
child: pw.Text(
text,
style: pw.TextStyle(
color: PdfColors.white,
fontWeight: pw.FontWeight.bold,
fontSize: 12,
),
textAlign: pw.TextAlign.center,
),
);
}
static pw.TableRow _buildPerProductDataRow({
required String product,
required String qty,
required String pendapatan,
required String hpp,
required String labaKotor,
required String margin,
required bool isEven,
}) {
return pw.TableRow(
decoration: pw.BoxDecoration(
color: isEven ? PdfColors.grey50 : PdfColors.white,
),
children: [
_buildDataCell(product, alignment: pw.Alignment.centerLeft),
_buildDataCell(qty),
_buildDataCell(pendapatan),
_buildDataCell(hpp, textColor: PdfColors.red600),
_buildDataCell(labaKotor, textColor: PdfColors.green600),
_buildDataCell(margin),
],
);
}
static pw.TableRow _buildPaymentMethodDataRow({
required String name,
required String tipe,
required String jumlahOrder,
required String totalAmount,
required String presentase,
required bool isEven,
}) {
return pw.TableRow(
decoration: pw.BoxDecoration(
color: isEven ? PdfColors.grey50 : PdfColors.white,
),
children: [
_buildDataCell(name, alignment: pw.Alignment.centerLeft),
_buildDataCell(tipe),
_buildDataCell(jumlahOrder),
_buildDataCell(totalAmount),
_buildDataCell(presentase),
],
);
}
static pw.TableRow _buildCategoryDataRow({
required String name,
required String totalProduct,
required String qty,
required String jumlahOrder,
required String pendapatan,
required bool isEven,
}) {
return pw.TableRow(
decoration: pw.BoxDecoration(
color: isEven ? PdfColors.grey50 : PdfColors.white,
),
children: [
_buildDataCell(name, alignment: pw.Alignment.centerLeft),
_buildDataCell(totalProduct),
_buildDataCell(qty),
_buildDataCell(jumlahOrder),
_buildDataCell(pendapatan),
],
);
}
static pw.TableRow _buildItemDataRow({
required String product,
required String category,
required String qty,
required String order,
required String pendapatan,
required String average,
required bool isEven,
}) {
return pw.TableRow(
decoration: pw.BoxDecoration(
color: isEven ? PdfColors.grey50 : PdfColors.white,
),
children: [
_buildDataCell(product, alignment: pw.Alignment.centerLeft),
_buildDataCell(category, alignment: pw.Alignment.centerLeft),
_buildDataCell(qty),
_buildDataCell(order),
_buildDataCell(pendapatan),
_buildDataCell(average),
],
);
}
}
+16 -279
View File
@@ -751,7 +751,6 @@ class PrintDataoutputs {
int paper, int paper,
String orderType, String orderType,
Outlet outlet, Outlet outlet,
List<ProductQuantity> products,
) async { ) async {
List<int> bytes = []; List<int> bytes = [];
@@ -866,16 +865,17 @@ class PrintDataoutputs {
? '------------------------------------------------' ? '------------------------------------------------'
: '--------------------------------', : '--------------------------------',
styles: const PosStyles(bold: false, align: PosAlign.center)); styles: const PosStyles(bold: false, align: PosAlign.center));
for (final product in (products ?? <ProductQuantity>[])) { for (final product
in (order.orderItems?.where((item) => item.status != 'cancelled') ??
<OrderItem>[])) {
bytes += generator.row([ bytes += generator.row([
PosColumn( PosColumn(
text: '${product.quantity} x ${product.product.name}', text: '${product.quantity} x ${product.productName}',
width: 8, width: 8,
styles: const PosStyles(bold: true, align: PosAlign.left), styles: const PosStyles(bold: true, align: PosAlign.left),
), ),
PosColumn( PosColumn(
text: (((product.product.price ?? 0) * product.quantity)) text: (product.totalPrice ?? 0).currencyFormatRpV2,
.currencyFormatRpV2,
width: 4, width: 4,
styles: const PosStyles(bold: true, align: PosAlign.right), styles: const PosStyles(bold: true, align: PosAlign.right),
), ),
@@ -889,7 +889,7 @@ class PrintDataoutputs {
bytes += generator.row([ bytes += generator.row([
PosColumn( PosColumn(
text: 'Subtotal ${products.length} Product', text: 'Subtotal ${order.orderItems?.length ?? "0"} Product',
width: 6, width: 6,
styles: const PosStyles(align: PosAlign.left), styles: const PosStyles(align: PosAlign.left),
), ),
@@ -1002,239 +1002,6 @@ class PrintDataoutputs {
return bytes; return bytes;
} }
Future<List<int>> printVoidOrder(
Order order,
String chashierName,
int taxPercentage,
int paper,
int nominalDikembalikan,
Outlet outlet,
List<OrderItem> productItemVoid,
) async {
List<int> bytes = [];
final profile = await CapabilityProfile.load();
final generator =
Generator(paper == 58 ? PaperSize.mm58 : PaperSize.mm80, profile);
bytes += generator.reset();
bytes += generator.text(outlet.name ?? "",
styles: const PosStyles(
bold: true,
align: PosAlign.center,
height: PosTextSize.size1,
width: PosTextSize.size1,
));
bytes += generator.text(outlet.address ?? "",
styles: const PosStyles(bold: false, align: PosAlign.center));
bytes += generator.text(outlet.phoneNumber ?? "",
styles: const PosStyles(bold: false, align: PosAlign.center));
bytes += generator.text(
paper == 80
? '------------------------------------------------'
: '--------------------------------',
styles: const PosStyles(bold: false, align: PosAlign.center));
bytes += generator.row([
PosColumn(
text: DateFormat('dd MMM yyyy').format(DateTime.now()),
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: DateFormat('HH:mm').format(DateTime.now()),
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
bytes += generator.row([
PosColumn(
text: 'Receipt Number',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: 'JF-${DateFormat('yyyyMMddhhmm').format(DateTime.now())}',
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
bytes += generator.row([
PosColumn(
text: 'Order ID',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: Random().nextInt(100000).toString(),
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
bytes += generator.row([
PosColumn(
text: 'Bill Name',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: order.metadata?['customer_name'] ?? '',
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
bytes += generator.row([
PosColumn(
text: 'Collected By',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: chashierName,
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
bytes += generator.row([
PosColumn(
text: 'Status',
width: 8,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: 'Dibatalkan',
width: 4,
styles: const PosStyles(align: PosAlign.right),
),
]);
for (final product in (productItemVoid ?? <OrderItem>[])) {
bytes += generator.row([
PosColumn(
text: '${product.quantity} x ${product.productName}',
width: 8,
styles: const PosStyles(bold: true, align: PosAlign.left),
),
PosColumn(
text: ((product.totalPrice ?? 0)).currencyFormatRpV2,
width: 4,
styles: const PosStyles(bold: true, align: PosAlign.right),
),
]);
}
bytes += generator.text(
paper == 80
? '------------------------------------------------'
: '--------------------------------',
styles: const PosStyles(bold: false, align: PosAlign.center));
bytes += generator.row([
PosColumn(
text: 'Subtotal ${productItemVoid.length} Product',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: (order.subtotal ?? 0).currencyFormatRpV2,
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
bytes += generator.row([
PosColumn(
text: 'Discount',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: (order.discountAmount ?? 0).currencyFormatRpV2,
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
// Only show tax if it's greater than 0
if ((order.taxAmount ?? 0) > 0) {
bytes += generator.row([
PosColumn(
text: 'Tax PB1 ($taxPercentage%)',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: (order.taxAmount ?? 0).currencyFormatRpV2,
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
}
// Only show service charge if it's greater than 0
// if (serviceCharge > 0) {
// bytes += generator.row([
// PosColumn(
// text: 'Service Charge($serviceChargePercentage%)',
// width: 6,
// styles: const PosStyles(align: PosAlign.left),
// ),
// PosColumn(
// text: serviceCharge.currencyFormatRpV2,
// width: 6,
// styles: const PosStyles(align: PosAlign.right),
// ),
// ]);
// }
bytes += generator.text(
paper == 80
? '------------------------------------------------'
: '--------------------------------',
styles: const PosStyles(bold: false, align: PosAlign.center));
bytes += generator.row([
PosColumn(
text: 'Total',
width: 6,
styles: const PosStyles(bold: true, align: PosAlign.left),
),
PosColumn(
text: '${order.totalAmount ?? ""}'.currencyFormatRpV2,
width: 6,
styles: const PosStyles(bold: true, align: PosAlign.right),
),
]);
bytes += generator.row([
PosColumn(
text: 'Dikembalikan',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: nominalDikembalikan.currencyFormatRpV2,
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
bytes += generator.text(
paper == 80
? '------------------------------------------------'
: '--------------------------------',
styles: const PosStyles(bold: false, align: PosAlign.center));
// bytes += generator.text('Notes',
// styles: const PosStyles(bold: false, align: PosAlign.center));
// bytes += generator.text('Pass Wifi: fic14jilid2',
// styles: const PosStyles(bold: false, align: PosAlign.center));
// //terima kasih
// bytes += generator.text('Terima Kasih',
// styles: const PosStyles(bold: true, align: PosAlign.center));
paper == 80 ? bytes += generator.feed(3) : bytes += generator.feed(1);
bytes += generator.cut();
return bytes;
}
Future<List<int>> printQRIS( Future<List<int>> printQRIS(
int totalPrice, Uint8List imageQris, int paper) async { int totalPrice, Uint8List imageQris, int paper) async {
List<int> bytes = []; List<int> bytes = [];
@@ -1275,7 +1042,6 @@ class PrintDataoutputs {
String tableName, String tableName,
String draftName, String draftName,
String cashierName, String cashierName,
String customerName,
int paper, int paper,
String orderType) async { String orderType) async {
List<int> bytes = []; List<int> bytes = [];
@@ -1331,6 +1097,9 @@ class PrintDataoutputs {
styles: const PosStyles(align: PosAlign.right), styles: const PosStyles(align: PosAlign.right),
), ),
]); ]);
// bytes += generator.text(
// 'Receipt: JF-${DateFormat('yyyyMMddhhmm').format(DateTime.now())}',
// styles: const PosStyles(bold: false, align: PosAlign.left));
//cashier name //cashier name
bytes += generator.row([ bytes += generator.row([
PosColumn( PosColumn(
@@ -1350,7 +1119,7 @@ class PrintDataoutputs {
//column 2 //column 2
bytes += generator.row([ bytes += generator.row([
PosColumn( PosColumn(
text: '$customerName - $draftName', text: 'Customer - $draftName',
width: 6, width: 6,
styles: const PosStyles(align: PosAlign.left), styles: const PosStyles(align: PosAlign.left),
), ),
@@ -1408,7 +1177,6 @@ class PrintDataoutputs {
String tableNumber, String tableNumber,
String draftName, String draftName,
String cashierName, String cashierName,
String customerName,
int paper, int paper,
String orderType) async { String orderType) async {
List<int> bytes = []; List<int> bytes = [];
@@ -1461,26 +1229,14 @@ class PrintDataoutputs {
styles: const PosStyles(align: PosAlign.left), styles: const PosStyles(align: PosAlign.left),
), ),
PosColumn( PosColumn(
text: DateFormat('yyyyMMddhhmm').format(DateTime.now()), text: 'JF-${DateFormat('yyyyMMddhhmm').format(DateTime.now())}',
width: 6, width: 6,
styles: const PosStyles(align: PosAlign.right), styles: const PosStyles(align: PosAlign.right),
), ),
]); ]);
bytes += generator.row([ bytes += generator.row([
PosColumn( PosColumn(
text: 'Cashier', text: 'Customer - $draftName',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: cashierName,
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
bytes += generator.row([
PosColumn(
text: '$customerName - $draftName',
width: 6, width: 6,
styles: const PosStyles(align: PosAlign.left), styles: const PosStyles(align: PosAlign.left),
), ),
@@ -1535,15 +1291,8 @@ class PrintDataoutputs {
return bytes; return bytes;
} }
Future<List<int>> printBar( Future<List<int>> printBar(List<ProductQuantity> products, String tableNumber,
List<ProductQuantity> products, String draftName, String cashierName, int paper, String orderType) async {
String tableNumber,
String draftName,
String cashierName,
String customerName,
int paper,
String orderType,
) async {
List<int> bytes = []; List<int> bytes = [];
final profile = await CapabilityProfile.load(); final profile = await CapabilityProfile.load();
@@ -1594,26 +1343,14 @@ class PrintDataoutputs {
styles: const PosStyles(align: PosAlign.left), styles: const PosStyles(align: PosAlign.left),
), ),
PosColumn( PosColumn(
text: DateFormat('yyyyMMddhhmm').format(DateTime.now()), text: 'JF-${DateFormat('yyyyMMddhhmm').format(DateTime.now())}',
width: 6, width: 6,
styles: const PosStyles(align: PosAlign.right), styles: const PosStyles(align: PosAlign.right),
), ),
]); ]);
bytes += generator.row([ bytes += generator.row([
PosColumn( PosColumn(
text: 'Cashier', text: 'Customer - $draftName',
width: 6,
styles: const PosStyles(align: PosAlign.left),
),
PosColumn(
text: cashierName,
width: 6,
styles: const PosStyles(align: PosAlign.right),
),
]);
bytes += generator.row([
PosColumn(
text: '$customerName - $draftName',
width: 6, width: 6,
styles: const PosStyles(align: PosAlign.left), styles: const PosStyles(align: PosAlign.left),
), ),
@@ -5,9 +5,7 @@ import 'package:dio/dio.dart';
import 'package:enaklo_pos/core/constants/variables.dart'; import 'package:enaklo_pos/core/constants/variables.dart';
import 'package:enaklo_pos/core/network/dio_client.dart'; import 'package:enaklo_pos/core/network/dio_client.dart';
import 'package:enaklo_pos/data/datasources/auth_local_datasource.dart'; import 'package:enaklo_pos/data/datasources/auth_local_datasource.dart';
import 'package:enaklo_pos/data/models/response/category_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/dashboard_analytic_response_model.dart'; import 'package:enaklo_pos/data/models/response/dashboard_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/inventory_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/payment_method_analytic_response_model.dart'; import 'package:enaklo_pos/data/models/response/payment_method_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/product_analytic_response_model.dart'; import 'package:enaklo_pos/data/models/response/product_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/profit_loss_response_model.dart'; import 'package:enaklo_pos/data/models/response/profit_loss_response_model.dart';
@@ -186,72 +184,4 @@ class AnalyticRemoteDatasource {
return left('Unexpected error occurred'); return left('Unexpected error occurred');
} }
} }
Future<Either<String, CategoryAnalyticResponseModel>> getCategory({
required DateTime dateFrom,
required DateTime dateTo,
}) async {
final authData = await AuthLocalDataSource().getAuthData();
final headers = {
'Authorization': 'Bearer ${authData.token}',
'Accept': 'application/json',
};
try {
final response = await dio.get(
'${Variables.baseUrl}/api/v1/analytics/categories',
queryParameters: {
'date_from': DateFormat('dd-MM-yyyy').format(dateFrom),
'date_to': DateFormat('dd-MM-yyyy').format(dateTo),
},
options: Options(headers: headers),
);
if (response.statusCode == 200) {
return right(CategoryAnalyticResponseModel.fromMap(response.data));
} else {
return left('Terjadi Kesalahan, Coba lagi nanti.');
}
} on DioException catch (e) {
log('Dio error: ${e.message}');
return left(e.response?.data.toString() ?? e.message ?? 'Unknown error');
} catch (e) {
log('Unexpected error: $e');
return left('Unexpected error occurred');
}
}
Future<Either<String, InventoryAnalyticResponseModel>> getInventory({
required DateTime dateFrom,
required DateTime dateTo,
}) async {
final authData = await AuthLocalDataSource().getAuthData();
final headers = {
'Authorization': 'Bearer ${authData.token}',
'Accept': 'application/json',
};
try {
final response = await dio.get(
'${Variables.baseUrl}/api/v1/inventory/report/details/${authData.user?.outletId}',
queryParameters: {
'date_from': DateFormat('dd-MM-yyyy').format(dateFrom),
'date_to': DateFormat('dd-MM-yyyy').format(dateTo),
},
options: Options(headers: headers),
);
if (response.statusCode == 200) {
return right(InventoryAnalyticResponseModel.fromMap(response.data));
} else {
return left('Terjadi Kesalahan, Coba lagi nanti.');
}
} on DioException catch (e) {
log('Dio error: ${e.message}');
return left(e.response?.data.toString() ?? e.message ?? 'Unknown error');
} catch (e) {
log('Unexpected error: $e');
return left('Unexpected error occurred');
}
}
} }
@@ -1,129 +0,0 @@
class CategoryAnalyticResponseModel {
final bool success;
final CategoryAnalyticData? data;
final dynamic errors;
CategoryAnalyticResponseModel({
required this.success,
required this.data,
this.errors,
});
// Dari JSON String ke Model
factory CategoryAnalyticResponseModel.fromJson(Map<String, dynamic> json) {
return CategoryAnalyticResponseModel(
success: json['success'],
data: json['data'] == null
? null
: CategoryAnalyticData.fromMap(json['data']),
errors: json['errors'],
);
}
// Dari Model ke JSON String
Map<String, dynamic> toJson() {
return {
'success': success,
'data': data?.toMap(),
'errors': errors,
};
}
// Dari Map ke Model
factory CategoryAnalyticResponseModel.fromMap(Map<String, dynamic> map) {
return CategoryAnalyticResponseModel(
success: map['success'],
data: CategoryAnalyticData.fromMap(map['data']),
errors: map['errors'],
);
}
// Dari Model ke Map
Map<String, dynamic> toMap() {
return {
'success': success,
'data': data?.toMap(),
'errors': errors,
};
}
}
class CategoryAnalyticData {
final String organizationId;
final String outletId;
final DateTime dateFrom;
final DateTime dateTo;
final List<CategoryAnalyticItem> data;
CategoryAnalyticData({
required this.organizationId,
required this.outletId,
required this.dateFrom,
required this.dateTo,
required this.data,
});
factory CategoryAnalyticData.fromMap(Map<String, dynamic> map) {
return CategoryAnalyticData(
organizationId: map['organization_id'],
outletId: map['outlet_id'],
dateFrom: DateTime.parse(map['date_from']),
dateTo: DateTime.parse(map['date_to']),
data: map['data'] == null
? []
: List<CategoryAnalyticItem>.from(
map['data']?.map((x) => CategoryAnalyticItem.fromMap(x)) ?? [],
),
);
}
Map<String, dynamic> toMap() {
return {
'organization_id': organizationId,
'outlet_id': outletId,
'date_from': dateFrom.toIso8601String(),
'date_to': dateTo.toIso8601String(),
'data': data.map((x) => x.toMap()).toList(),
};
}
}
class CategoryAnalyticItem {
final String categoryId;
final String categoryName;
final int totalRevenue;
final int totalQuantity;
final int productCount;
final int orderCount;
CategoryAnalyticItem({
required this.categoryId,
required this.categoryName,
required this.totalRevenue,
required this.totalQuantity,
required this.productCount,
required this.orderCount,
});
factory CategoryAnalyticItem.fromMap(Map<String, dynamic> map) {
return CategoryAnalyticItem(
categoryId: map['category_id'],
categoryName: map['category_name'],
totalRevenue: map['total_revenue'] ?? 0,
totalQuantity: map['total_quantity'] ?? 0,
productCount: map['product_count'] ?? 0,
orderCount: map['order_count'] ?? 0,
);
}
Map<String, dynamic> toMap() {
return {
'category_id': categoryId,
'category_name': categoryName,
'total_revenue': totalRevenue,
'total_quantity': totalQuantity,
'product_count': productCount,
'order_count': orderCount,
};
}
}
@@ -1,290 +0,0 @@
class InventoryAnalyticResponseModel {
final bool success;
final InventoryAnalyticData? data;
final dynamic errors;
InventoryAnalyticResponseModel({
required this.success,
required this.data,
this.errors,
});
// From JSON
factory InventoryAnalyticResponseModel.fromJson(Map<String, dynamic> json) {
return InventoryAnalyticResponseModel(
success: json['success'],
data: json['data'] != null
? InventoryAnalyticData.fromMap(json['data'])
: null,
errors: json['errors'],
);
}
// To JSON
Map<String, dynamic> toJson() {
return {
'success': success,
'data': data?.toMap(),
'errors': errors,
};
}
// From Map
factory InventoryAnalyticResponseModel.fromMap(Map<String, dynamic> map) {
return InventoryAnalyticResponseModel(
success: map['success'],
data: map['data'] != null
? InventoryAnalyticData.fromMap(map['data'])
: null,
errors: map['errors'],
);
}
// To Map
Map<String, dynamic> toMap() {
return {
'success': success,
'data': data?.toMap(),
'errors': errors,
};
}
}
class InventoryAnalyticData {
final InventorySummary summary;
final List<InventoryProductItem> products;
final List<InventoryIngredientItem> ingredients;
InventoryAnalyticData({
required this.summary,
required this.products,
required this.ingredients,
});
factory InventoryAnalyticData.fromMap(Map<String, dynamic> map) {
return InventoryAnalyticData(
summary: InventorySummary.fromMap(map['summary']),
products: map['products'] == null
? []
: List<InventoryProductItem>.from(
map['products']?.map((x) => InventoryProductItem.fromMap(x)) ??
[],
),
ingredients: map['ingredients'] == null
? []
: List<InventoryIngredientItem>.from(
map['ingredients']
?.map((x) => InventoryIngredientItem.fromMap(x)) ??
[],
),
);
}
Map<String, dynamic> toMap() {
return {
'summary': summary.toMap(),
'products': products.map((x) => x.toMap()).toList(),
'ingredients': ingredients.map((x) => x.toMap()).toList(),
};
}
}
class InventorySummary {
final int totalProducts;
final int totalIngredients;
final int totalValue;
final int lowStockProducts;
final int lowStockIngredients;
final int zeroStockProducts;
final int zeroStockIngredients;
final int totalSoldProducts;
final int totalSoldIngredients;
final String outletId;
final String outletName;
final DateTime generatedAt;
InventorySummary({
required this.totalProducts,
required this.totalIngredients,
required this.totalValue,
required this.lowStockProducts,
required this.lowStockIngredients,
required this.zeroStockProducts,
required this.zeroStockIngredients,
required this.totalSoldProducts,
required this.totalSoldIngredients,
required this.outletId,
required this.outletName,
required this.generatedAt,
});
factory InventorySummary.fromMap(Map<String, dynamic> map) {
return InventorySummary(
totalProducts: map['total_products'] ?? 0,
totalIngredients: map['total_ingredients'] ?? 0,
totalValue: map['total_value'] ?? 0,
lowStockProducts: map['low_stock_products'] ?? 0,
lowStockIngredients: map['low_stock_ingredients'] ?? 0,
zeroStockProducts: map['zero_stock_products'] ?? 0,
zeroStockIngredients: map['zero_stock_ingredients'] ?? 0,
totalSoldProducts: map['total_sold_products'] ?? 0,
totalSoldIngredients: map['total_sold_ingredients'] ?? 0,
outletId: map['outlet_id'],
outletName: map['outlet_name'],
generatedAt: DateTime.parse(map['generated_at']),
);
}
Map<String, dynamic> toMap() {
return {
'total_products': totalProducts,
'total_ingredients': totalIngredients,
'total_value': totalValue,
'low_stock_products': lowStockProducts,
'low_stock_ingredients': lowStockIngredients,
'zero_stock_products': zeroStockProducts,
'zero_stock_ingredients': zeroStockIngredients,
'total_sold_products': totalSoldProducts,
'total_sold_ingredients': totalSoldIngredients,
'outlet_id': outletId,
'outlet_name': outletName,
'generated_at': generatedAt.toIso8601String(),
};
}
}
class InventoryProductItem {
final String id;
final String productId;
final String productName;
final String categoryName;
final int quantity;
final int reorderLevel;
final int unitCost;
final int totalValue;
final int totalIn;
final int totalOut;
final bool isLowStock;
final bool isZeroStock;
final DateTime updatedAt;
InventoryProductItem({
required this.id,
required this.productId,
required this.productName,
required this.categoryName,
required this.quantity,
required this.reorderLevel,
required this.unitCost,
required this.totalValue,
required this.totalIn,
required this.totalOut,
required this.isLowStock,
required this.isZeroStock,
required this.updatedAt,
});
factory InventoryProductItem.fromMap(Map<String, dynamic> map) {
return InventoryProductItem(
id: map['id'],
productId: map['product_id'],
productName: map['product_name'],
categoryName: map['category_name'],
quantity: map['quantity'] ?? 0,
reorderLevel: map['reorder_level'] ?? 0,
unitCost: map['unit_cost'] ?? 0,
totalValue: map['total_value'] ?? 0,
totalIn: map['total_in'] ?? 0,
totalOut: map['total_out'] ?? 0,
isLowStock: map['is_low_stock'] ?? false,
isZeroStock: map['is_zero_stock'] ?? false,
updatedAt: DateTime.parse(map['updated_at']),
);
}
Map<String, dynamic> toMap() {
return {
'id': id,
'product_id': productId,
'product_name': productName,
'category_name': categoryName,
'quantity': quantity,
'reorder_level': reorderLevel,
'unit_cost': unitCost,
'total_value': totalValue,
'total_in': totalIn,
'total_out': totalOut,
'is_low_stock': isLowStock,
'is_zero_stock': isZeroStock,
'updated_at': updatedAt.toIso8601String(),
};
}
}
class InventoryIngredientItem {
final String id;
final String ingredientId;
final String ingredientName;
final String unitName;
final int quantity;
final int reorderLevel;
final int unitCost;
final int totalValue;
final int totalIn;
final int totalOut;
final bool isLowStock;
final bool isZeroStock;
final DateTime updatedAt;
InventoryIngredientItem({
required this.id,
required this.ingredientId,
required this.ingredientName,
required this.unitName,
required this.quantity,
required this.reorderLevel,
required this.unitCost,
required this.totalValue,
required this.totalIn,
required this.totalOut,
required this.isLowStock,
required this.isZeroStock,
required this.updatedAt,
});
factory InventoryIngredientItem.fromMap(Map<String, dynamic> map) {
return InventoryIngredientItem(
id: map['id'],
ingredientId: map['ingredient_id'],
ingredientName: map['ingredient_name'],
unitName: map['unit_name'],
quantity: map['quantity'] ?? 0,
reorderLevel: map['reorder_level'] ?? 0,
unitCost: map['unit_cost'] ?? 0,
totalValue: map['total_value'] ?? 0,
totalIn: map['total_in'] ?? 0,
totalOut: map['total_out'] ?? 0,
isLowStock: map['is_low_stock'] ?? false,
isZeroStock: map['is_zero_stock'] ?? false,
updatedAt: DateTime.parse(map['updated_at']),
);
}
Map<String, dynamic> toMap() {
return {
'id': id,
'ingredient_id': ingredientId,
'ingredient_name': ingredientName,
'unit_name': unitName,
'quantity': quantity,
'reorder_level': reorderLevel,
'unit_cost': unitCost,
'total_value': totalValue,
'total_in': totalIn,
'total_out': totalOut,
'is_low_stock': isLowStock,
'is_zero_stock': isZeroStock,
'updated_at': updatedAt.toIso8601String(),
};
}
}
@@ -1,6 +1,6 @@
class PaymentMethodAnalyticResponseModel { class PaymentMethodAnalyticResponseModel {
final bool success; final bool success;
final PaymentMethodAnalyticData? data; final PaymentMethodAnalyticData data;
final dynamic errors; final dynamic errors;
PaymentMethodAnalyticResponseModel({ PaymentMethodAnalyticResponseModel({
@@ -18,9 +18,7 @@ class PaymentMethodAnalyticResponseModel {
factory PaymentMethodAnalyticResponseModel.fromMap(Map<String, dynamic> map) { factory PaymentMethodAnalyticResponseModel.fromMap(Map<String, dynamic> map) {
return PaymentMethodAnalyticResponseModel( return PaymentMethodAnalyticResponseModel(
success: map['success'], success: map['success'],
data: map['data'] == null data: PaymentMethodAnalyticData.fromMap(map['data']),
? null
: PaymentMethodAnalyticData.fromMap(map['data']),
errors: map['errors'], errors: map['errors'],
); );
} }
@@ -28,7 +26,7 @@ class PaymentMethodAnalyticResponseModel {
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
'success': success, 'success': success,
'data': data?.toMap(), 'data': data.toMap(),
'errors': errors, 'errors': errors,
}; };
} }
@@ -1,6 +1,6 @@
class ProductAnalyticResponseModel { class ProductAnalyticResponseModel {
final bool success; final bool success;
final ProductAnalyticData? data; final ProductAnalyticData data;
final dynamic errors; final dynamic errors;
ProductAnalyticResponseModel({ ProductAnalyticResponseModel({
@@ -17,8 +17,7 @@ class ProductAnalyticResponseModel {
factory ProductAnalyticResponseModel.fromMap(Map<String, dynamic> map) { factory ProductAnalyticResponseModel.fromMap(Map<String, dynamic> map) {
return ProductAnalyticResponseModel( return ProductAnalyticResponseModel(
success: map['success'] ?? false, success: map['success'] ?? false,
data: data: ProductAnalyticData.fromMap(map['data']),
map['data'] == null ? null : ProductAnalyticData.fromMap(map['data']),
errors: map['errors'], errors: map['errors'],
); );
} }
@@ -26,7 +25,7 @@ class ProductAnalyticResponseModel {
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
'success': success, 'success': success,
'data': data?.toMap(), 'data': data.toMap(),
'errors': errors, 'errors': errors,
}; };
} }
@@ -1,6 +1,6 @@
class ProfitLossResponseModel { class ProfitLossResponseModel {
final bool success; final bool success;
final ProfitLossData? data; final ProfitLossData data;
final dynamic errors; final dynamic errors;
ProfitLossResponseModel({ ProfitLossResponseModel({
@@ -13,7 +13,7 @@ class ProfitLossResponseModel {
factory ProfitLossResponseModel.fromJson(Map<String, dynamic> json) { factory ProfitLossResponseModel.fromJson(Map<String, dynamic> json) {
return ProfitLossResponseModel( return ProfitLossResponseModel(
success: json['success'], success: json['success'],
data: json['data'] == null ? null : ProfitLossData.fromMap(json['data']), data: ProfitLossData.fromMap(json['data']),
errors: json['errors'], errors: json['errors'],
); );
} }
@@ -22,7 +22,7 @@ class ProfitLossResponseModel {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {
'success': success, 'success': success,
'data': data?.toMap(), 'data': data.toMap(),
'errors': errors, 'errors': errors,
}; };
} }
@@ -40,7 +40,7 @@ class ProfitLossResponseModel {
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
'success': success, 'success': success,
'data': data?.toMap(), 'data': data.toMap(),
'errors': errors, 'errors': errors,
}; };
} }
@@ -106,7 +106,7 @@ class ProfitLossSummary {
final int netProfit; final int netProfit;
final double netProfitMargin; final double netProfitMargin;
final int totalOrders; final int totalOrders;
final double averageProfit; final int averageProfit;
final double profitabilityRatio; final double profitabilityRatio;
ProfitLossSummary({ ProfitLossSummary({
@@ -134,7 +134,7 @@ class ProfitLossSummary {
netProfit: map['net_profit'], netProfit: map['net_profit'],
netProfitMargin: (map['net_profit_margin'] as num).toDouble(), netProfitMargin: (map['net_profit_margin'] as num).toDouble(),
totalOrders: map['total_orders'], totalOrders: map['total_orders'],
averageProfit: (map['average_profit'] as num).toDouble(), averageProfit: map['average_profit'],
profitabilityRatio: (map['profitability_ratio'] as num).toDouble(), profitabilityRatio: (map['profitability_ratio'] as num).toDouble(),
); );
} }
@@ -252,8 +252,8 @@ class ProfitLossProduct {
cost: map['cost'], cost: map['cost'],
grossProfit: map['gross_profit'], grossProfit: map['gross_profit'],
grossProfitMargin: (map['gross_profit_margin'] as num).toDouble(), grossProfitMargin: (map['gross_profit_margin'] as num).toDouble(),
averagePrice: (map['average_price'] as num).toInt(), averagePrice: map['average_price'],
averageCost: (map['average_cost'] as num).toInt(), averageCost: map['average_cost'],
profitPerUnit: map['profit_per_unit'], profitPerUnit: map['profit_per_unit'],
); );
} }
-12
View File
@@ -16,10 +16,7 @@ import 'package:enaklo_pos/presentation/home/bloc/outlet_loader/outlet_loader_bl
import 'package:enaklo_pos/presentation/home/bloc/product_loader/product_loader_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/product_loader/product_loader_bloc.dart';
import 'package:enaklo_pos/presentation/home/bloc/user_update_outlet/user_update_outlet_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/user_update_outlet/user_update_outlet_bloc.dart';
import 'package:enaklo_pos/presentation/refund/bloc/refund_bloc.dart'; import 'package:enaklo_pos/presentation/refund/bloc/refund_bloc.dart';
import 'package:enaklo_pos/presentation/report/blocs/category_report/category_report_bloc.dart';
import 'package:enaklo_pos/presentation/report/blocs/inventory_report/inventory_report_bloc.dart';
import 'package:enaklo_pos/presentation/report/blocs/profit_loss/profit_loss_bloc.dart'; import 'package:enaklo_pos/presentation/report/blocs/profit_loss/profit_loss_bloc.dart';
import 'package:enaklo_pos/presentation/report/blocs/report/report_bloc.dart';
import 'package:enaklo_pos/presentation/sales/blocs/order_loader/order_loader_bloc.dart'; import 'package:enaklo_pos/presentation/sales/blocs/order_loader/order_loader_bloc.dart';
import 'package:enaklo_pos/presentation/sales/blocs/payment_form/payment_form_bloc.dart'; import 'package:enaklo_pos/presentation/sales/blocs/payment_form/payment_form_bloc.dart';
import 'package:enaklo_pos/presentation/setting/bloc/get_printer_ticket/get_printer_ticket_bloc.dart'; import 'package:enaklo_pos/presentation/setting/bloc/get_printer_ticket/get_printer_ticket_bloc.dart';
@@ -291,15 +288,6 @@ class _MyAppState extends State<MyApp> {
BlocProvider( BlocProvider(
create: (context) => TransferTableBloc(TableRemoteDataSource()), create: (context) => TransferTableBloc(TableRemoteDataSource()),
), ),
BlocProvider(
create: (context) => ReportBloc(AnalyticRemoteDatasource()),
),
BlocProvider(
create: (context) => InventoryReportBloc(AnalyticRemoteDatasource()),
),
BlocProvider(
create: (context) => CategoryReportBloc(AnalyticRemoteDatasource()),
),
], ],
child: MaterialApp( child: MaterialApp(
navigatorKey: AuthInterceptor.navigatorKey, navigatorKey: AuthInterceptor.navigatorKey,
@@ -131,7 +131,7 @@ class CheckoutBloc extends Bloc<CheckoutEvent, CheckoutState> {
final serviceCharge = await settingsLocalDatasource.getServiceCharge(); final serviceCharge = await settingsLocalDatasource.getServiceCharge();
emit(_Loaded( emit(_Loaded(
event.items, [],
null, null,
0, 0,
0, 0,
@@ -18,7 +18,7 @@ final _privateConstructorUsedError = UnsupportedError(
mixin _$CheckoutEvent { mixin _$CheckoutEvent {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -41,7 +41,7 @@ mixin _$CheckoutEvent {
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -61,7 +61,7 @@ mixin _$CheckoutEvent {
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -166,8 +166,6 @@ abstract class _$$StartedImplCopyWith<$Res> {
factory _$$StartedImplCopyWith( factory _$$StartedImplCopyWith(
_$StartedImpl value, $Res Function(_$StartedImpl) then) = _$StartedImpl value, $Res Function(_$StartedImpl) then) =
__$$StartedImplCopyWithImpl<$Res>; __$$StartedImplCopyWithImpl<$Res>;
@useResult
$Res call({List<ProductQuantity> items});
} }
/// @nodoc /// @nodoc
@@ -180,62 +178,31 @@ class __$$StartedImplCopyWithImpl<$Res>
/// Create a copy of CheckoutEvent /// Create a copy of CheckoutEvent
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? items = null,
}) {
return _then(_$StartedImpl(
null == items
? _value._items
: items // ignore: cast_nullable_to_non_nullable
as List<ProductQuantity>,
));
}
} }
/// @nodoc /// @nodoc
class _$StartedImpl implements _Started { class _$StartedImpl implements _Started {
const _$StartedImpl(final List<ProductQuantity> items) : _items = items; const _$StartedImpl();
final List<ProductQuantity> _items;
@override
List<ProductQuantity> get items {
if (_items is EqualUnmodifiableListView) return _items;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_items);
}
@override @override
String toString() { String toString() {
return 'CheckoutEvent.started(items: $items)'; return 'CheckoutEvent.started()';
} }
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return identical(this, other) || return identical(this, other) ||
(other.runtimeType == runtimeType && (other.runtimeType == runtimeType && other is _$StartedImpl);
other is _$StartedImpl &&
const DeepCollectionEquality().equals(other._items, _items));
} }
@override @override
int get hashCode => int get hashCode => runtimeType.hashCode;
Object.hash(runtimeType, const DeepCollectionEquality().hash(_items));
/// Create a copy of CheckoutEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$StartedImplCopyWith<_$StartedImpl> get copyWith =>
__$$StartedImplCopyWithImpl<_$StartedImpl>(this, _$identity);
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -255,13 +222,13 @@ class _$StartedImpl implements _Started {
required TResult Function(DraftOrderModel data) loadDraftOrder, required TResult Function(DraftOrderModel data) loadDraftOrder,
required TResult Function(DeliveryModel delivery) updateDeliveryType, required TResult Function(DeliveryModel delivery) updateDeliveryType,
}) { }) {
return started(items); return started();
} }
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -278,13 +245,13 @@ class _$StartedImpl implements _Started {
TResult? Function(DraftOrderModel data)? loadDraftOrder, TResult? Function(DraftOrderModel data)? loadDraftOrder,
TResult? Function(DeliveryModel delivery)? updateDeliveryType, TResult? Function(DeliveryModel delivery)? updateDeliveryType,
}) { }) {
return started?.call(items); return started?.call();
} }
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -303,7 +270,7 @@ class _$StartedImpl implements _Started {
required TResult orElse(), required TResult orElse(),
}) { }) {
if (started != null) { if (started != null) {
return started(items); return started();
} }
return orElse(); return orElse();
} }
@@ -380,15 +347,7 @@ class _$StartedImpl implements _Started {
} }
abstract class _Started implements CheckoutEvent { abstract class _Started implements CheckoutEvent {
const factory _Started(final List<ProductQuantity> items) = _$StartedImpl; const factory _Started() = _$StartedImpl;
List<ProductQuantity> get items;
/// Create a copy of CheckoutEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$StartedImplCopyWith<_$StartedImpl> get copyWith =>
throw _privateConstructorUsedError;
} }
/// @nodoc /// @nodoc
@@ -467,7 +426,7 @@ class _$AddItemImpl implements _AddItem {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -493,7 +452,7 @@ class _$AddItemImpl implements _AddItem {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -516,7 +475,7 @@ class _$AddItemImpl implements _AddItem {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -701,7 +660,7 @@ class _$RemoveItemImpl implements _RemoveItem {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -727,7 +686,7 @@ class _$RemoveItemImpl implements _RemoveItem {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -750,7 +709,7 @@ class _$RemoveItemImpl implements _RemoveItem {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -935,7 +894,7 @@ class _$DeleteItemImpl implements _DeleteItem {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -961,7 +920,7 @@ class _$DeleteItemImpl implements _DeleteItem {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -984,7 +943,7 @@ class _$DeleteItemImpl implements _DeleteItem {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -1162,7 +1121,7 @@ class _$AddDiscountImpl implements _AddDiscount {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -1188,7 +1147,7 @@ class _$AddDiscountImpl implements _AddDiscount {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -1211,7 +1170,7 @@ class _$AddDiscountImpl implements _AddDiscount {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -1359,7 +1318,7 @@ class _$RemoveDiscountImpl implements _RemoveDiscount {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -1385,7 +1344,7 @@ class _$RemoveDiscountImpl implements _RemoveDiscount {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -1408,7 +1367,7 @@ class _$RemoveDiscountImpl implements _RemoveDiscount {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -1575,7 +1534,7 @@ class _$AddTaxImpl implements _AddTax {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -1601,7 +1560,7 @@ class _$AddTaxImpl implements _AddTax {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -1624,7 +1583,7 @@ class _$AddTaxImpl implements _AddTax {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -1801,7 +1760,7 @@ class _$AddServiceChargeImpl implements _AddServiceCharge {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -1827,7 +1786,7 @@ class _$AddServiceChargeImpl implements _AddServiceCharge {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -1850,7 +1809,7 @@ class _$AddServiceChargeImpl implements _AddServiceCharge {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -1999,7 +1958,7 @@ class _$RemoveTaxImpl implements _RemoveTax {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -2025,7 +1984,7 @@ class _$RemoveTaxImpl implements _RemoveTax {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2048,7 +2007,7 @@ class _$RemoveTaxImpl implements _RemoveTax {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2189,7 +2148,7 @@ class _$RemoveServiceChargeImpl implements _RemoveServiceCharge {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -2215,7 +2174,7 @@ class _$RemoveServiceChargeImpl implements _RemoveServiceCharge {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2238,7 +2197,7 @@ class _$RemoveServiceChargeImpl implements _RemoveServiceCharge {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2407,7 +2366,7 @@ class _$UpdateOrderTypeImpl implements _UpdateOrderType {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -2433,7 +2392,7 @@ class _$UpdateOrderTypeImpl implements _UpdateOrderType {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2456,7 +2415,7 @@ class _$UpdateOrderTypeImpl implements _UpdateOrderType {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2641,7 +2600,7 @@ class _$UpdateItemNotesImpl implements _UpdateItemNotes {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -2667,7 +2626,7 @@ class _$UpdateItemNotesImpl implements _UpdateItemNotes {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2690,7 +2649,7 @@ class _$UpdateItemNotesImpl implements _UpdateItemNotes {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2889,7 +2848,7 @@ class _$SaveDraftOrderImpl implements _SaveDraftOrder {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -2915,7 +2874,7 @@ class _$SaveDraftOrderImpl implements _SaveDraftOrder {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2938,7 +2897,7 @@ class _$SaveDraftOrderImpl implements _SaveDraftOrder {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -3117,7 +3076,7 @@ class _$LoadDraftOrderImpl implements _LoadDraftOrder {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -3143,7 +3102,7 @@ class _$LoadDraftOrderImpl implements _LoadDraftOrder {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -3166,7 +3125,7 @@ class _$LoadDraftOrderImpl implements _LoadDraftOrder {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -3344,7 +3303,7 @@ class _$UpdateDeliveryTypeImpl implements _UpdateDeliveryType {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(List<ProductQuantity> items) started, required TResult Function() started,
required TResult Function(Product product, ProductVariant? variant) addItem, required TResult Function(Product product, ProductVariant? variant) addItem,
required TResult Function(Product product, ProductVariant? variant) required TResult Function(Product product, ProductVariant? variant)
removeItem, removeItem,
@@ -3370,7 +3329,7 @@ class _$UpdateDeliveryTypeImpl implements _UpdateDeliveryType {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(List<ProductQuantity> items)? started, TResult? Function()? started,
TResult? Function(Product product, ProductVariant? variant)? addItem, TResult? Function(Product product, ProductVariant? variant)? addItem,
TResult? Function(Product product, ProductVariant? variant)? removeItem, TResult? Function(Product product, ProductVariant? variant)? removeItem,
TResult? Function(Product product, ProductVariant? variant)? deleteItem, TResult? Function(Product product, ProductVariant? variant)? deleteItem,
@@ -3393,7 +3352,7 @@ class _$UpdateDeliveryTypeImpl implements _UpdateDeliveryType {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(List<ProductQuantity> items)? started, TResult Function()? started,
TResult Function(Product product, ProductVariant? variant)? addItem, TResult Function(Product product, ProductVariant? variant)? addItem,
TResult Function(Product product, ProductVariant? variant)? removeItem, TResult Function(Product product, ProductVariant? variant)? removeItem,
TResult Function(Product product, ProductVariant? variant)? deleteItem, TResult Function(Product product, ProductVariant? variant)? deleteItem,
@@ -2,7 +2,7 @@ part of 'checkout_bloc.dart';
@freezed @freezed
class CheckoutEvent with _$CheckoutEvent { class CheckoutEvent with _$CheckoutEvent {
const factory CheckoutEvent.started(List<ProductQuantity> items) = _Started; const factory CheckoutEvent.started() = _Started;
//add item //add item
const factory CheckoutEvent.addItem( const factory CheckoutEvent.addItem(
Product product, ProductVariant? variant) = _AddItem; Product product, ProductVariant? variant) = _AddItem;
@@ -12,7 +12,7 @@ import 'package:intl/intl.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/presentation/home/bloc/qris/qris_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/qris/qris_bloc.dart';
// import 'package:enaklo_pos/presentation/home/widgets/success_payment_dialog.dart'; import 'package:enaklo_pos/presentation/home/widgets/success_payment_dialog.dart';
import 'package:widgets_to_image/widgets_to_image.dart'; import 'package:widgets_to_image/widgets_to_image.dart';
import 'package:enaklo_pos/core/utils/printer_service.dart'; import 'package:enaklo_pos/core/utils/printer_service.dart';
@@ -124,36 +124,36 @@ class _PaymentQrisDialogState extends State<PaymentQrisDialog> {
)); ));
}); });
}, success: (message) async { }, success: (message) async {
// context.read<OrderBloc>().add(OrderEvent.order( context.read<OrderBloc>().add(OrderEvent.order(
// widget.items, widget.items,
// widget.discount, widget.discount,
// widget.discountAmount, widget.discountAmount,
// widget.tax, widget.tax,
// widget.serviceCharge, widget.serviceCharge,
// widget.paymentAmount, widget.paymentAmount,
// widget.customerName, widget.customerName,
// widget.tableNumber, widget.tableNumber,
// 'completed', 'completed',
// 'paid', 'paid',
// 'Qris', 'Qris',
// widget.price, widget.price,
// OrderType.dineIn)); OrderType.dineIn));
// await showDialog( await showDialog(
// context: context, context: context,
// barrierDismissible: false, barrierDismissible: false,
// builder: (context) => SuccessPaymentDialog( builder: (context) => SuccessPaymentDialog(
// isTablePaymentPage: widget.isTablePaymentPage, isTablePaymentPage: widget.isTablePaymentPage,
// data: widget.items, data: widget.items,
// totalQty: widget.totalQty, totalQty: widget.totalQty,
// totalPrice: widget.price, totalPrice: widget.price,
// totalTax: widget.tax, totalTax: widget.tax,
// totalDiscount: widget.discountAmount, totalDiscount: widget.discountAmount,
// subTotal: widget.subTotal, subTotal: widget.subTotal,
// normalPrice: widget.price, normalPrice: widget.price,
// totalService: widget.serviceCharge, totalService: widget.serviceCharge,
// draftName: widget.customerName, draftName: widget.customerName,
// ), ),
// ); );
}); });
}, },
child: BlocBuilder<QrisBloc, QrisState>( child: BlocBuilder<QrisBloc, QrisState>(
@@ -13,7 +13,7 @@ import 'package:enaklo_pos/presentation/home/bloc/order/order_bloc.dart';
import 'package:enaklo_pos/presentation/home/bloc/payment_methods/payment_methods_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/payment_methods/payment_methods_bloc.dart';
import 'package:enaklo_pos/presentation/home/models/product_quantity.dart'; import 'package:enaklo_pos/presentation/home/models/product_quantity.dart';
import 'package:enaklo_pos/presentation/home/models/order_type.dart'; import 'package:enaklo_pos/presentation/home/models/order_type.dart';
// import 'package:enaklo_pos/presentation/home/widgets/save_order_dialog.dart'; import 'package:enaklo_pos/presentation/home/widgets/save_order_dialog.dart';
import 'package:enaklo_pos/data/models/response/payment_methods_response_model.dart'; import 'package:enaklo_pos/data/models/response/payment_methods_response_model.dart';
import 'package:enaklo_pos/data/datasources/product_local_datasource.dart'; import 'package:enaklo_pos/data/datasources/product_local_datasource.dart';
@@ -4,7 +4,6 @@ import 'dart:developer';
import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:enaklo_pos/presentation/customer/pages/customer_page.dart'; import 'package:enaklo_pos/presentation/customer/pages/customer_page.dart';
import 'package:enaklo_pos/presentation/home/models/product_quantity.dart';
import 'package:enaklo_pos/presentation/setting/pages/setting_page.dart'; import 'package:enaklo_pos/presentation/setting/pages/setting_page.dart';
import 'package:enaklo_pos/presentation/table/pages/table_page.dart'; import 'package:enaklo_pos/presentation/table/pages/table_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -27,13 +26,10 @@ import 'home_page.dart';
class DashboardPage extends StatefulWidget { class DashboardPage extends StatefulWidget {
final int? index; final int? index;
final TableModel? table; final TableModel? table;
final List<ProductQuantity>? items;
const DashboardPage({ const DashboardPage({
super.key, super.key,
this.index = 0, this.index = 0,
this.table, this.table,
this.items,
}); });
@override @override
@@ -60,11 +56,8 @@ class _DashboardPageState extends State<DashboardPage> {
HomePage( HomePage(
isTable: false, isTable: false,
table: widget.table, table: widget.table,
items: widget.items ?? [],
),
TablePage(
items: widget.items ?? [],
), ),
const TablePage(),
const ReportPage(), const ReportPage(),
const CustomerPage(), const CustomerPage(),
const SettingPage(), const SettingPage(),
+3 -22
View File
@@ -4,7 +4,6 @@ import 'package:enaklo_pos/presentation/home/bloc/category_loader/category_loade
import 'package:enaklo_pos/presentation/home/bloc/current_outlet/current_outlet_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/current_outlet/current_outlet_bloc.dart';
import 'package:enaklo_pos/presentation/home/bloc/product_loader/product_loader_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/product_loader/product_loader_bloc.dart';
import 'package:enaklo_pos/presentation/home/bloc/user_update_outlet/user_update_outlet_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/user_update_outlet/user_update_outlet_bloc.dart';
import 'package:enaklo_pos/presentation/home/models/product_quantity.dart';
import 'package:enaklo_pos/presentation/home/widgets/category_tab_bar.dart'; import 'package:enaklo_pos/presentation/home/widgets/category_tab_bar.dart';
import 'package:enaklo_pos/presentation/home/widgets/home_right_title.dart'; import 'package:enaklo_pos/presentation/home/widgets/home_right_title.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -28,12 +27,10 @@ import '../widgets/product_card.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
final bool isTable; final bool isTable;
final TableModel? table; final TableModel? table;
final List<ProductQuantity> items;
const HomePage({ const HomePage({
super.key, super.key,
required this.isTable, required this.isTable,
this.table, this.table,
required this.items,
}); });
@override @override
@@ -78,7 +75,7 @@ class _HomePageState extends State<HomePage> {
.add(const ProductLoaderEvent.getProduct()); .add(const ProductLoaderEvent.getProduct());
// Initialize checkout with tax and service charge settings // Initialize checkout with tax and service charge settings
context.read<CheckoutBloc>().add(CheckoutEvent.started(widget.items)); context.read<CheckoutBloc>().add(const CheckoutEvent.started());
// Get Category // Get Category
context.read<CategoryLoaderBloc>().add(CategoryLoaderEvent.get()); context.read<CategoryLoaderBloc>().add(CategoryLoaderEvent.get());
@@ -214,24 +211,8 @@ class _HomePageState extends State<HomePage> {
final filteredProducts = final filteredProducts =
_filterProducts(products); _filterProducts(products);
if (filteredProducts.isEmpty) { if (filteredProducts.isEmpty) {
return Center( return const Center(
child: Column( child: Text('No Items Found'),
children: [
Text('No Items Found'),
SpaceHeight(20),
Button.filled(
width: 120,
onPressed: () {
context
.read<
ProductLoaderBloc>()
.add(const ProductLoaderEvent
.getProduct());
},
label: 'Retry',
),
],
),
); );
} }
return GridView.builder( return GridView.builder(
@@ -135,7 +135,6 @@ class HomeRightTitle extends StatelessWidget {
if (table == null) { if (table == null) {
context.push(DashboardPage( context.push(DashboardPage(
index: 1, index: 1,
items: items,
)); ));
} }
}, },
@@ -0,0 +1,211 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:enaklo_pos/core/extensions/string_ext.dart';
import 'package:enaklo_pos/data/datasources/product_local_datasource.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/data/dataoutputs/print_dataoutputs.dart';
import 'package:enaklo_pos/data/models/response/table_model.dart';
import 'package:enaklo_pos/presentation/home/models/product_quantity.dart';
import '../../../core/assets/assets.gen.dart';
import '../../../core/components/buttons.dart';
import '../../../core/components/spaces.dart';
import '../../table/blocs/get_table/get_table_bloc.dart';
import '../bloc/checkout/checkout_bloc.dart';
import '../models/order_type.dart';
import 'package:enaklo_pos/core/utils/printer_service.dart';
class SaveOrderDialog extends StatefulWidget {
const SaveOrderDialog({
super.key,
required this.data,
required this.totalQty,
required this.totalPrice,
required this.totalTax,
required this.totalDiscount,
required this.subTotal,
required this.normalPrice,
required this.table,
required this.draftName,
});
final List<ProductQuantity> data;
final int totalQty;
final int totalPrice;
final int totalTax;
final int totalDiscount;
final int subTotal;
final int normalPrice;
final TableModel table;
final String draftName;
@override
State<SaveOrderDialog> createState() => _SaveOrderDialogState();
}
class _SaveOrderDialogState extends State<SaveOrderDialog> {
// List<ProductQuantity> data = [];
// int totalQty = 0;
// int totalPrice = 0;
@override
Widget build(BuildContext context) {
return AlertDialog(
content: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(child: Assets.icons.success.svg()),
const SpaceHeight(16.0),
const Center(
child: Text(
'Order Berhasil Disimpan',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
),
),
),
const SpaceHeight(20.0),
Row(
children: [
Flexible(
child: Button.outlined(
onPressed: () {
context
.read<CheckoutBloc>()
.add(const CheckoutEvent.started());
context
.read<GetTableBloc>()
.add(const GetTableEvent.getTables());
context.popToRoot();
},
label: 'Kembali',
),
),
const SpaceWidth(8.0),
Flexible(
child: BlocBuilder<CheckoutBloc, CheckoutState>(
builder: (context, state) {
final orderType = state.maybeWhen(
orElse: () => OrderType.dineIn,
loaded: (
items,
discountModel,
discount,
discountAmount,
tax,
serviceCharge,
totalQuantity,
totalPrice,
draftName,
orderType,
deliveryType,
) =>
orderType,
);
return Button.filled(
onPressed: () async {
final checkerPrinter = await ProductLocalDatasource
.instance
.getPrinterByCode('checker');
final kitchenPrinter = await ProductLocalDatasource
.instance
.getPrinterByCode('kitchen');
final barPrinter = await ProductLocalDatasource
.instance
.getPrinterByCode('bar');
log("Checker printer: ${checkerPrinter?.toMap()}");
log("Kitchen printer: ${kitchenPrinter?.toMap()}");
log("Bar printer: ${barPrinter?.toMap()}");
// Checker printer
if (checkerPrinter != null) {
try {
final printValue = await PrintDataoutputs.instance
.printChecker(
widget.data,
widget.table.tableName!,
widget.draftName,
'kasir',
checkerPrinter.paper.toIntegerFromText,
orderType.value);
await PrinterService().printWithPrinter(
checkerPrinter, printValue, context);
} catch (e) {
log("Error printing checker: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content:
Text('Error printing checker: $e')),
);
}
}
// Kitchen printer
if (kitchenPrinter != null) {
try {
final printValue =
await PrintDataoutputs.instance.printKitchen(
widget.data,
widget.table.tableName!,
widget.draftName,
'kasir',
kitchenPrinter.paper.toIntegerFromText,
orderType.value,
);
await PrinterService().printWithPrinter(
kitchenPrinter, printValue, context);
} catch (e) {
log("Error printing kitchen order: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Error printing kitchen order: $e')),
);
}
}
// Bar printer
if (barPrinter != null) {
try {
final printValue =
await PrintDataoutputs.instance.printBar(
widget.data,
widget.table.tableName!,
widget.draftName,
'kasir',
barPrinter.paper.toIntegerFromText,
orderType.value,
);
await PrinterService().printWithPrinter(
barPrinter, printValue, context);
} catch (e) {
log("Error printing bar order: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content:
Text('Error printing bar order: $e')),
);
}
}
},
label: 'Print Checker',
);
},
),
),
],
),
],
),
),
);
}
}
@@ -0,0 +1,349 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/core/extensions/int_ext.dart';
import 'package:enaklo_pos/core/extensions/string_ext.dart';
import 'package:enaklo_pos/data/dataoutputs/print_dataoutputs.dart';
import 'package:enaklo_pos/data/datasources/product_local_datasource.dart';
import 'package:enaklo_pos/presentation/home/models/product_quantity.dart';
import 'package:enaklo_pos/presentation/home/models/order_type.dart';
import 'package:enaklo_pos/core/utils/printer_service.dart';
import 'package:enaklo_pos/data/datasources/settings_local_datasource.dart';
import '../../../core/assets/assets.gen.dart';
import '../../../core/components/buttons.dart';
import '../../../core/components/spaces.dart';
import '../../table/blocs/get_table/get_table_bloc.dart';
import '../bloc/checkout/checkout_bloc.dart';
import '../bloc/order/order_bloc.dart';
class SuccessPaymentDialog extends StatefulWidget {
const SuccessPaymentDialog({
Key? key,
required this.data,
required this.totalQty,
required this.totalPrice,
required this.totalTax,
required this.totalDiscount,
required this.subTotal,
required this.normalPrice,
required this.totalService,
required this.draftName,
this.isTablePaymentPage = false,
}) : super(key: key);
final List<ProductQuantity> data;
final int totalQty;
final int totalPrice;
final int totalTax;
final int totalDiscount;
final int subTotal;
final int normalPrice;
final int totalService;
final String draftName;
final bool? isTablePaymentPage;
@override
State<SuccessPaymentDialog> createState() => _SuccessPaymentDialogState();
}
class _SuccessPaymentDialogState extends State<SuccessPaymentDialog> {
// List<ProductQuantity> data = [];
// int totalQty = 0;
// int totalPrice = 0;
@override
Widget build(BuildContext context) {
return AlertDialog(
content: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(child: Assets.icons.success.svg()),
const SpaceHeight(16.0),
const Center(
child: Text(
'Pembayaran telah sukses dilakukan',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
),
),
),
const SpaceHeight(20.0),
const Text('METODE BAYAR'),
const SpaceHeight(5.0),
BlocBuilder<OrderBloc, OrderState>(
builder: (context, state) {
final paymentMethod = state.maybeWhen(
orElse: () => 'Cash',
loaded: (model, orderId) => model.paymentMethod,
);
return Text(
paymentMethod,
style: const TextStyle(
fontWeight: FontWeight.w700,
),
);
},
),
const SpaceHeight(10.0),
const Divider(),
const SpaceHeight(8.0),
const Text('TOTAL TAGIHAN'),
const SpaceHeight(5.0),
BlocBuilder<OrderBloc, OrderState>(
builder: (context, state) {
state.maybeWhen(
orElse: () => 0,
loaded: (model, orderId) => model.total,
);
return Text(
widget.totalPrice.currencyFormatRp,
style: const TextStyle(
fontWeight: FontWeight.w700,
),
);
},
),
const SpaceHeight(10.0),
const Divider(),
const SpaceHeight(8.0),
const Text('NOMINAL BAYAR'),
const SpaceHeight(5.0),
BlocBuilder<OrderBloc, OrderState>(
builder: (context, state) {
final paymentAmount = state.maybeWhen(
orElse: () => 0,
loaded: (model, orderId) => model.paymentAmount,
);
return Text(
paymentAmount.ceil().currencyFormatRp,
style: const TextStyle(
fontWeight: FontWeight.w700,
),
);
},
),
const Divider(),
const SpaceHeight(8.0),
const Text('KEMBALIAN'),
const SpaceHeight(5.0),
BlocBuilder<OrderBloc, OrderState>(
builder: (context, state) {
final paymentAmount = state.maybeWhen(
orElse: () => 0,
loaded: (model, orderId) => model.paymentAmount,
);
final total = state.maybeWhen(
orElse: () => 0,
loaded: (model, orderId) => model.total,
);
final diff = paymentAmount - total;
log("DIFF: $diff paymentAmount: $paymentAmount total: $total");
return Text(
diff.ceil().currencyFormatRp,
style: const TextStyle(
fontWeight: FontWeight.w700,
),
);
},
),
const SpaceHeight(10.0),
const Divider(),
const SpaceHeight(8.0),
const Text('WAKTU PEMBAYARAN'),
const SpaceHeight(5.0),
Text(
DateFormat('dd MMMM yyyy, HH:mm').format(DateTime.now()),
style: const TextStyle(
fontWeight: FontWeight.w700,
),
),
const SpaceHeight(20.0),
Row(
children: [
Flexible(
child: Button.outlined(
onPressed: () {
// For table payment page, just close the dialog
// The cleanup and navigation is handled by the payment page
if (widget.isTablePaymentPage == true) {
Navigator.of(context).pop(); // Close dialog only
} else {
// For regular payment flow, reset and go to root
context
.read<CheckoutBloc>()
.add(const CheckoutEvent.started());
context
.read<GetTableBloc>()
.add(const GetTableEvent.getTables());
context.popToRoot();
}
},
label: 'Kembali',
),
),
const SpaceWidth(8.0),
Flexible(
child: BlocBuilder<OrderBloc, OrderState>(
builder: (context, state) {
final paymentAmount = state.maybeWhen(
orElse: () => 0,
loaded: (model, orderId) => model.paymentAmount,
);
final kembalian = paymentAmount - widget.totalPrice;
return BlocBuilder<CheckoutBloc, CheckoutState>(
builder: (context, checkoutState) {
final orderType = checkoutState.maybeWhen(
orElse: () => OrderType.dineIn,
loaded: (
items,
discountModel,
discount,
discountAmount,
tax,
serviceCharge,
totalQuantity,
totalPrice,
draftName,
orderType,
deliveryType,
) =>
orderType,
);
return Button.filled(
onPressed: () async {
final receiptPrinter =
await ProductLocalDatasource.instance
.getPrinterByCode('receipt');
final kitchenPrinter =
await ProductLocalDatasource.instance
.getPrinterByCode('kitchen');
final barPrinter = await ProductLocalDatasource
.instance
.getPrinterByCode('bar');
// Receipt Printer
if (receiptPrinter != null) {
try {
final settingsLocalDatasource =
SettingsLocalDatasource();
final taxModel =
await settingsLocalDatasource.getTax();
final serviceChargeValue =
await settingsLocalDatasource
.getServiceCharge();
// Get the actual payment method from OrderBloc
final paymentMethod = state.maybeWhen(
orElse: () => 'Cash',
loaded: (model, orderId) =>
model.paymentMethod,
);
final printValue = await PrintDataoutputs
.instance
.printOrderV3(
widget.data,
widget.totalQty,
widget.totalPrice,
paymentMethod,
paymentAmount,
kembalian,
widget.subTotal,
widget.totalDiscount,
widget.totalTax,
widget.totalService,
'kasir',
widget.draftName,
receiptPrinter.paper.toIntegerFromText,
taxPercentage: taxModel.value,
serviceChargePercentage: serviceChargeValue,
);
await PrinterService().printWithPrinter(
receiptPrinter, printValue, context);
} catch (e) {
log("Error printing receipt: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content:
Text('Error printing receipt: $e')),
);
}
}
// Kitchen Printer
if (kitchenPrinter != null &&
widget.isTablePaymentPage == false) {
try {
final printValue = await PrintDataoutputs
.instance
.printKitchen(
widget.data,
'',
widget.draftName,
'kasir',
kitchenPrinter.paper.toIntegerFromText,
orderType.value,
);
await PrinterService().printWithPrinter(
kitchenPrinter, printValue, context);
} catch (e) {
log("Error printing kitchen order: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Error printing kitchen order: $e')),
);
}
}
// Bar printer
if (barPrinter != null &&
widget.isTablePaymentPage == false) {
try {
final printValue =
await PrintDataoutputs.instance.printBar(
widget.data,
'',
widget.draftName,
'kasir',
barPrinter.paper.toIntegerFromText,
orderType.value,
);
await PrinterService().printWithPrinter(
barPrinter, printValue, context);
} catch (e) {
log("Error printing bar order: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Error printing bar order: $e')),
);
}
}
},
label: 'Print',
);
},
);
},
),
),
],
),
],
),
),
);
}
}
@@ -372,7 +372,8 @@ class _PaymentPageState extends State<PaymentPage> {
success: (data) { success: (data) {
context.pushReplacement(SuccessPaymentPage( context.pushReplacement(SuccessPaymentPage(
productQuantity: widget.order.orderItems productQuantity: widget.order.orderItems
?.map( ?.where((item) => item.status == "pending")
.map(
(item) => ProductQuantity( (item) => ProductQuantity(
product: Product( product: Product(
name: item.productName, name: item.productName,
@@ -1,28 +0,0 @@
import 'package:bloc/bloc.dart';
import 'package:enaklo_pos/data/datasources/analytic_remote_datasource.dart';
import 'package:enaklo_pos/data/models/response/category_analytic_response_model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'category_report_event.dart';
part 'category_report_state.dart';
part 'category_report_bloc.freezed.dart';
class CategoryReportBloc
extends Bloc<CategoryReportEvent, CategoryReportState> {
final AnalyticRemoteDatasource _datasource;
CategoryReportBloc(this._datasource) : super(CategoryReportState.initial()) {
on<_Get>((event, emit) async {
emit(_Loading());
final result = await _datasource.getCategory(
dateFrom: event.startDate,
dateTo: event.endDate,
);
result.fold(
(l) => emit(_Error(l)),
(r) => emit(_Loaded(r.data!)),
);
});
}
}
@@ -1,861 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'category_report_bloc.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
/// @nodoc
mixin _$CategoryReportEvent {
DateTime get startDate => throw _privateConstructorUsedError;
DateTime get endDate => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime startDate, DateTime endDate) get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime startDate, DateTime endDate)? get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime startDate, DateTime endDate)? get,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Get value) get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Get value)? get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Get value)? get,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
/// Create a copy of CategoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$CategoryReportEventCopyWith<CategoryReportEvent> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $CategoryReportEventCopyWith<$Res> {
factory $CategoryReportEventCopyWith(
CategoryReportEvent value, $Res Function(CategoryReportEvent) then) =
_$CategoryReportEventCopyWithImpl<$Res, CategoryReportEvent>;
@useResult
$Res call({DateTime startDate, DateTime endDate});
}
/// @nodoc
class _$CategoryReportEventCopyWithImpl<$Res, $Val extends CategoryReportEvent>
implements $CategoryReportEventCopyWith<$Res> {
_$CategoryReportEventCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of CategoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? startDate = null,
Object? endDate = null,
}) {
return _then(_value.copyWith(
startDate: null == startDate
? _value.startDate
: startDate // ignore: cast_nullable_to_non_nullable
as DateTime,
endDate: null == endDate
? _value.endDate
: endDate // ignore: cast_nullable_to_non_nullable
as DateTime,
) as $Val);
}
}
/// @nodoc
abstract class _$$GetImplCopyWith<$Res>
implements $CategoryReportEventCopyWith<$Res> {
factory _$$GetImplCopyWith(_$GetImpl value, $Res Function(_$GetImpl) then) =
__$$GetImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({DateTime startDate, DateTime endDate});
}
/// @nodoc
class __$$GetImplCopyWithImpl<$Res>
extends _$CategoryReportEventCopyWithImpl<$Res, _$GetImpl>
implements _$$GetImplCopyWith<$Res> {
__$$GetImplCopyWithImpl(_$GetImpl _value, $Res Function(_$GetImpl) _then)
: super(_value, _then);
/// Create a copy of CategoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? startDate = null,
Object? endDate = null,
}) {
return _then(_$GetImpl(
startDate: null == startDate
? _value.startDate
: startDate // ignore: cast_nullable_to_non_nullable
as DateTime,
endDate: null == endDate
? _value.endDate
: endDate // ignore: cast_nullable_to_non_nullable
as DateTime,
));
}
}
/// @nodoc
class _$GetImpl implements _Get {
const _$GetImpl({required this.startDate, required this.endDate});
@override
final DateTime startDate;
@override
final DateTime endDate;
@override
String toString() {
return 'CategoryReportEvent.get(startDate: $startDate, endDate: $endDate)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$GetImpl &&
(identical(other.startDate, startDate) ||
other.startDate == startDate) &&
(identical(other.endDate, endDate) || other.endDate == endDate));
}
@override
int get hashCode => Object.hash(runtimeType, startDate, endDate);
/// Create a copy of CategoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$GetImplCopyWith<_$GetImpl> get copyWith =>
__$$GetImplCopyWithImpl<_$GetImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime startDate, DateTime endDate) get,
}) {
return get(startDate, endDate);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime startDate, DateTime endDate)? get,
}) {
return get?.call(startDate, endDate);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime startDate, DateTime endDate)? get,
required TResult orElse(),
}) {
if (get != null) {
return get(startDate, endDate);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Get value) get,
}) {
return get(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Get value)? get,
}) {
return get?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Get value)? get,
required TResult orElse(),
}) {
if (get != null) {
return get(this);
}
return orElse();
}
}
abstract class _Get implements CategoryReportEvent {
const factory _Get(
{required final DateTime startDate,
required final DateTime endDate}) = _$GetImpl;
@override
DateTime get startDate;
@override
DateTime get endDate;
/// Create a copy of CategoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$GetImplCopyWith<_$GetImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
mixin _$CategoryReportState {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(CategoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(CategoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(CategoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $CategoryReportStateCopyWith<$Res> {
factory $CategoryReportStateCopyWith(
CategoryReportState value, $Res Function(CategoryReportState) then) =
_$CategoryReportStateCopyWithImpl<$Res, CategoryReportState>;
}
/// @nodoc
class _$CategoryReportStateCopyWithImpl<$Res, $Val extends CategoryReportState>
implements $CategoryReportStateCopyWith<$Res> {
_$CategoryReportStateCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of CategoryReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
abstract class _$$InitialImplCopyWith<$Res> {
factory _$$InitialImplCopyWith(
_$InitialImpl value, $Res Function(_$InitialImpl) then) =
__$$InitialImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$InitialImplCopyWithImpl<$Res>
extends _$CategoryReportStateCopyWithImpl<$Res, _$InitialImpl>
implements _$$InitialImplCopyWith<$Res> {
__$$InitialImplCopyWithImpl(
_$InitialImpl _value, $Res Function(_$InitialImpl) _then)
: super(_value, _then);
/// Create a copy of CategoryReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$InitialImpl implements _Initial {
const _$InitialImpl();
@override
String toString() {
return 'CategoryReportState.initial()';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$InitialImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(CategoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) {
return initial();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(CategoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) {
return initial?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(CategoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) {
if (initial != null) {
return initial();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return initial(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return initial?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (initial != null) {
return initial(this);
}
return orElse();
}
}
abstract class _Initial implements CategoryReportState {
const factory _Initial() = _$InitialImpl;
}
/// @nodoc
abstract class _$$LoadingImplCopyWith<$Res> {
factory _$$LoadingImplCopyWith(
_$LoadingImpl value, $Res Function(_$LoadingImpl) then) =
__$$LoadingImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$LoadingImplCopyWithImpl<$Res>
extends _$CategoryReportStateCopyWithImpl<$Res, _$LoadingImpl>
implements _$$LoadingImplCopyWith<$Res> {
__$$LoadingImplCopyWithImpl(
_$LoadingImpl _value, $Res Function(_$LoadingImpl) _then)
: super(_value, _then);
/// Create a copy of CategoryReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$LoadingImpl implements _Loading {
const _$LoadingImpl();
@override
String toString() {
return 'CategoryReportState.loading()';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$LoadingImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(CategoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) {
return loading();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(CategoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) {
return loading?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(CategoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) {
if (loading != null) {
return loading();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return loading(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return loading?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (loading != null) {
return loading(this);
}
return orElse();
}
}
abstract class _Loading implements CategoryReportState {
const factory _Loading() = _$LoadingImpl;
}
/// @nodoc
abstract class _$$LoadedImplCopyWith<$Res> {
factory _$$LoadedImplCopyWith(
_$LoadedImpl value, $Res Function(_$LoadedImpl) then) =
__$$LoadedImplCopyWithImpl<$Res>;
@useResult
$Res call({CategoryAnalyticData data});
}
/// @nodoc
class __$$LoadedImplCopyWithImpl<$Res>
extends _$CategoryReportStateCopyWithImpl<$Res, _$LoadedImpl>
implements _$$LoadedImplCopyWith<$Res> {
__$$LoadedImplCopyWithImpl(
_$LoadedImpl _value, $Res Function(_$LoadedImpl) _then)
: super(_value, _then);
/// Create a copy of CategoryReportState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? data = null,
}) {
return _then(_$LoadedImpl(
null == data
? _value.data
: data // ignore: cast_nullable_to_non_nullable
as CategoryAnalyticData,
));
}
}
/// @nodoc
class _$LoadedImpl implements _Loaded {
const _$LoadedImpl(this.data);
@override
final CategoryAnalyticData data;
@override
String toString() {
return 'CategoryReportState.loaded(data: $data)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$LoadedImpl &&
(identical(other.data, data) || other.data == data));
}
@override
int get hashCode => Object.hash(runtimeType, data);
/// Create a copy of CategoryReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$LoadedImplCopyWith<_$LoadedImpl> get copyWith =>
__$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(CategoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) {
return loaded(data);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(CategoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) {
return loaded?.call(data);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(CategoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) {
if (loaded != null) {
return loaded(data);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return loaded(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return loaded?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (loaded != null) {
return loaded(this);
}
return orElse();
}
}
abstract class _Loaded implements CategoryReportState {
const factory _Loaded(final CategoryAnalyticData data) = _$LoadedImpl;
CategoryAnalyticData get data;
/// Create a copy of CategoryReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$LoadedImplCopyWith<_$LoadedImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class _$$ErrorImplCopyWith<$Res> {
factory _$$ErrorImplCopyWith(
_$ErrorImpl value, $Res Function(_$ErrorImpl) then) =
__$$ErrorImplCopyWithImpl<$Res>;
@useResult
$Res call({String message});
}
/// @nodoc
class __$$ErrorImplCopyWithImpl<$Res>
extends _$CategoryReportStateCopyWithImpl<$Res, _$ErrorImpl>
implements _$$ErrorImplCopyWith<$Res> {
__$$ErrorImplCopyWithImpl(
_$ErrorImpl _value, $Res Function(_$ErrorImpl) _then)
: super(_value, _then);
/// Create a copy of CategoryReportState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? message = null,
}) {
return _then(_$ErrorImpl(
null == message
? _value.message
: message // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// @nodoc
class _$ErrorImpl implements _Error {
const _$ErrorImpl(this.message);
@override
final String message;
@override
String toString() {
return 'CategoryReportState.error(message: $message)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$ErrorImpl &&
(identical(other.message, message) || other.message == message));
}
@override
int get hashCode => Object.hash(runtimeType, message);
/// Create a copy of CategoryReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$ErrorImplCopyWith<_$ErrorImpl> get copyWith =>
__$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(CategoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) {
return error(message);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(CategoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) {
return error?.call(message);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(CategoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) {
if (error != null) {
return error(message);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return error(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return error?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (error != null) {
return error(this);
}
return orElse();
}
}
abstract class _Error implements CategoryReportState {
const factory _Error(final String message) = _$ErrorImpl;
String get message;
/// Create a copy of CategoryReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$ErrorImplCopyWith<_$ErrorImpl> get copyWith =>
throw _privateConstructorUsedError;
}
@@ -1,9 +0,0 @@
part of 'category_report_bloc.dart';
@freezed
class CategoryReportEvent with _$CategoryReportEvent {
const factory CategoryReportEvent.get({
required DateTime startDate,
required DateTime endDate,
}) = _Get;
}
@@ -1,9 +0,0 @@
part of 'category_report_bloc.dart';
@freezed
class CategoryReportState with _$CategoryReportState {
const factory CategoryReportState.initial() = _Initial;
const factory CategoryReportState.loading() = _Loading;
const factory CategoryReportState.loaded(CategoryAnalyticData data) = _Loaded;
const factory CategoryReportState.error(String message) = _Error;
}
@@ -1,29 +0,0 @@
import 'package:bloc/bloc.dart';
import 'package:enaklo_pos/data/datasources/analytic_remote_datasource.dart';
import 'package:enaklo_pos/data/models/response/inventory_analytic_response_model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'inventory_report_event.dart';
part 'inventory_report_state.dart';
part 'inventory_report_bloc.freezed.dart';
class InventoryReportBloc
extends Bloc<InventoryReportEvent, InventoryReportState> {
final AnalyticRemoteDatasource _datasource;
InventoryReportBloc(this._datasource)
: super(InventoryReportState.initial()) {
on<_Get>((event, emit) async {
emit(_Loading());
final result = await _datasource.getInventory(
dateFrom: event.startDate, dateTo: event.endDate);
result.fold(
(f) => emit(_Error(f)),
(r) => emit(
_Loaded(r.data!),
),
);
});
}
}
@@ -1,863 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'inventory_report_bloc.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
/// @nodoc
mixin _$InventoryReportEvent {
DateTime get startDate => throw _privateConstructorUsedError;
DateTime get endDate => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime startDate, DateTime endDate) get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime startDate, DateTime endDate)? get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime startDate, DateTime endDate)? get,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Get value) get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Get value)? get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Get value)? get,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
/// Create a copy of InventoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$InventoryReportEventCopyWith<InventoryReportEvent> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $InventoryReportEventCopyWith<$Res> {
factory $InventoryReportEventCopyWith(InventoryReportEvent value,
$Res Function(InventoryReportEvent) then) =
_$InventoryReportEventCopyWithImpl<$Res, InventoryReportEvent>;
@useResult
$Res call({DateTime startDate, DateTime endDate});
}
/// @nodoc
class _$InventoryReportEventCopyWithImpl<$Res,
$Val extends InventoryReportEvent>
implements $InventoryReportEventCopyWith<$Res> {
_$InventoryReportEventCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of InventoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? startDate = null,
Object? endDate = null,
}) {
return _then(_value.copyWith(
startDate: null == startDate
? _value.startDate
: startDate // ignore: cast_nullable_to_non_nullable
as DateTime,
endDate: null == endDate
? _value.endDate
: endDate // ignore: cast_nullable_to_non_nullable
as DateTime,
) as $Val);
}
}
/// @nodoc
abstract class _$$GetImplCopyWith<$Res>
implements $InventoryReportEventCopyWith<$Res> {
factory _$$GetImplCopyWith(_$GetImpl value, $Res Function(_$GetImpl) then) =
__$$GetImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({DateTime startDate, DateTime endDate});
}
/// @nodoc
class __$$GetImplCopyWithImpl<$Res>
extends _$InventoryReportEventCopyWithImpl<$Res, _$GetImpl>
implements _$$GetImplCopyWith<$Res> {
__$$GetImplCopyWithImpl(_$GetImpl _value, $Res Function(_$GetImpl) _then)
: super(_value, _then);
/// Create a copy of InventoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? startDate = null,
Object? endDate = null,
}) {
return _then(_$GetImpl(
startDate: null == startDate
? _value.startDate
: startDate // ignore: cast_nullable_to_non_nullable
as DateTime,
endDate: null == endDate
? _value.endDate
: endDate // ignore: cast_nullable_to_non_nullable
as DateTime,
));
}
}
/// @nodoc
class _$GetImpl implements _Get {
const _$GetImpl({required this.startDate, required this.endDate});
@override
final DateTime startDate;
@override
final DateTime endDate;
@override
String toString() {
return 'InventoryReportEvent.get(startDate: $startDate, endDate: $endDate)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$GetImpl &&
(identical(other.startDate, startDate) ||
other.startDate == startDate) &&
(identical(other.endDate, endDate) || other.endDate == endDate));
}
@override
int get hashCode => Object.hash(runtimeType, startDate, endDate);
/// Create a copy of InventoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$GetImplCopyWith<_$GetImpl> get copyWith =>
__$$GetImplCopyWithImpl<_$GetImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime startDate, DateTime endDate) get,
}) {
return get(startDate, endDate);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime startDate, DateTime endDate)? get,
}) {
return get?.call(startDate, endDate);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime startDate, DateTime endDate)? get,
required TResult orElse(),
}) {
if (get != null) {
return get(startDate, endDate);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Get value) get,
}) {
return get(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Get value)? get,
}) {
return get?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Get value)? get,
required TResult orElse(),
}) {
if (get != null) {
return get(this);
}
return orElse();
}
}
abstract class _Get implements InventoryReportEvent {
const factory _Get(
{required final DateTime startDate,
required final DateTime endDate}) = _$GetImpl;
@override
DateTime get startDate;
@override
DateTime get endDate;
/// Create a copy of InventoryReportEvent
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$GetImplCopyWith<_$GetImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
mixin _$InventoryReportState {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(InventoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(InventoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(InventoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $InventoryReportStateCopyWith<$Res> {
factory $InventoryReportStateCopyWith(InventoryReportState value,
$Res Function(InventoryReportState) then) =
_$InventoryReportStateCopyWithImpl<$Res, InventoryReportState>;
}
/// @nodoc
class _$InventoryReportStateCopyWithImpl<$Res,
$Val extends InventoryReportState>
implements $InventoryReportStateCopyWith<$Res> {
_$InventoryReportStateCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of InventoryReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
abstract class _$$InitialImplCopyWith<$Res> {
factory _$$InitialImplCopyWith(
_$InitialImpl value, $Res Function(_$InitialImpl) then) =
__$$InitialImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$InitialImplCopyWithImpl<$Res>
extends _$InventoryReportStateCopyWithImpl<$Res, _$InitialImpl>
implements _$$InitialImplCopyWith<$Res> {
__$$InitialImplCopyWithImpl(
_$InitialImpl _value, $Res Function(_$InitialImpl) _then)
: super(_value, _then);
/// Create a copy of InventoryReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$InitialImpl implements _Initial {
const _$InitialImpl();
@override
String toString() {
return 'InventoryReportState.initial()';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$InitialImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(InventoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) {
return initial();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(InventoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) {
return initial?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(InventoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) {
if (initial != null) {
return initial();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return initial(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return initial?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (initial != null) {
return initial(this);
}
return orElse();
}
}
abstract class _Initial implements InventoryReportState {
const factory _Initial() = _$InitialImpl;
}
/// @nodoc
abstract class _$$LoadingImplCopyWith<$Res> {
factory _$$LoadingImplCopyWith(
_$LoadingImpl value, $Res Function(_$LoadingImpl) then) =
__$$LoadingImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$LoadingImplCopyWithImpl<$Res>
extends _$InventoryReportStateCopyWithImpl<$Res, _$LoadingImpl>
implements _$$LoadingImplCopyWith<$Res> {
__$$LoadingImplCopyWithImpl(
_$LoadingImpl _value, $Res Function(_$LoadingImpl) _then)
: super(_value, _then);
/// Create a copy of InventoryReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$LoadingImpl implements _Loading {
const _$LoadingImpl();
@override
String toString() {
return 'InventoryReportState.loading()';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$LoadingImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(InventoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) {
return loading();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(InventoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) {
return loading?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(InventoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) {
if (loading != null) {
return loading();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return loading(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return loading?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (loading != null) {
return loading(this);
}
return orElse();
}
}
abstract class _Loading implements InventoryReportState {
const factory _Loading() = _$LoadingImpl;
}
/// @nodoc
abstract class _$$LoadedImplCopyWith<$Res> {
factory _$$LoadedImplCopyWith(
_$LoadedImpl value, $Res Function(_$LoadedImpl) then) =
__$$LoadedImplCopyWithImpl<$Res>;
@useResult
$Res call({InventoryAnalyticData data});
}
/// @nodoc
class __$$LoadedImplCopyWithImpl<$Res>
extends _$InventoryReportStateCopyWithImpl<$Res, _$LoadedImpl>
implements _$$LoadedImplCopyWith<$Res> {
__$$LoadedImplCopyWithImpl(
_$LoadedImpl _value, $Res Function(_$LoadedImpl) _then)
: super(_value, _then);
/// Create a copy of InventoryReportState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? data = null,
}) {
return _then(_$LoadedImpl(
null == data
? _value.data
: data // ignore: cast_nullable_to_non_nullable
as InventoryAnalyticData,
));
}
}
/// @nodoc
class _$LoadedImpl implements _Loaded {
const _$LoadedImpl(this.data);
@override
final InventoryAnalyticData data;
@override
String toString() {
return 'InventoryReportState.loaded(data: $data)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$LoadedImpl &&
(identical(other.data, data) || other.data == data));
}
@override
int get hashCode => Object.hash(runtimeType, data);
/// Create a copy of InventoryReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$LoadedImplCopyWith<_$LoadedImpl> get copyWith =>
__$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(InventoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) {
return loaded(data);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(InventoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) {
return loaded?.call(data);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(InventoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) {
if (loaded != null) {
return loaded(data);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return loaded(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return loaded?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (loaded != null) {
return loaded(this);
}
return orElse();
}
}
abstract class _Loaded implements InventoryReportState {
const factory _Loaded(final InventoryAnalyticData data) = _$LoadedImpl;
InventoryAnalyticData get data;
/// Create a copy of InventoryReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$LoadedImplCopyWith<_$LoadedImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class _$$ErrorImplCopyWith<$Res> {
factory _$$ErrorImplCopyWith(
_$ErrorImpl value, $Res Function(_$ErrorImpl) then) =
__$$ErrorImplCopyWithImpl<$Res>;
@useResult
$Res call({String message});
}
/// @nodoc
class __$$ErrorImplCopyWithImpl<$Res>
extends _$InventoryReportStateCopyWithImpl<$Res, _$ErrorImpl>
implements _$$ErrorImplCopyWith<$Res> {
__$$ErrorImplCopyWithImpl(
_$ErrorImpl _value, $Res Function(_$ErrorImpl) _then)
: super(_value, _then);
/// Create a copy of InventoryReportState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? message = null,
}) {
return _then(_$ErrorImpl(
null == message
? _value.message
: message // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// @nodoc
class _$ErrorImpl implements _Error {
const _$ErrorImpl(this.message);
@override
final String message;
@override
String toString() {
return 'InventoryReportState.error(message: $message)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$ErrorImpl &&
(identical(other.message, message) || other.message == message));
}
@override
int get hashCode => Object.hash(runtimeType, message);
/// Create a copy of InventoryReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$ErrorImplCopyWith<_$ErrorImpl> get copyWith =>
__$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(InventoryAnalyticData data) loaded,
required TResult Function(String message) error,
}) {
return error(message);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(InventoryAnalyticData data)? loaded,
TResult? Function(String message)? error,
}) {
return error?.call(message);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(InventoryAnalyticData data)? loaded,
TResult Function(String message)? error,
required TResult orElse(),
}) {
if (error != null) {
return error(message);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return error(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return error?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (error != null) {
return error(this);
}
return orElse();
}
}
abstract class _Error implements InventoryReportState {
const factory _Error(final String message) = _$ErrorImpl;
String get message;
/// Create a copy of InventoryReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$ErrorImplCopyWith<_$ErrorImpl> get copyWith =>
throw _privateConstructorUsedError;
}
@@ -1,9 +0,0 @@
part of 'inventory_report_bloc.dart';
@freezed
class InventoryReportEvent with _$InventoryReportEvent {
const factory InventoryReportEvent.get({
required DateTime startDate,
required DateTime endDate,
}) = _Get;
}
@@ -1,10 +0,0 @@
part of 'inventory_report_bloc.dart';
@freezed
class InventoryReportState with _$InventoryReportState {
const factory InventoryReportState.initial() = _Initial;
const factory InventoryReportState.loading() = _Loading;
const factory InventoryReportState.loaded(InventoryAnalyticData data) =
_Loaded;
const factory InventoryReportState.error(String message) = _Error;
}
@@ -22,7 +22,7 @@ class PaymentMethodReportBloc
(l) => emit(_Error(l)), (l) => emit(_Error(l)),
(r) => emit( (r) => emit(
_Loaded( _Loaded(
r.data!, r.data,
), ),
), ),
); );
@@ -16,7 +16,7 @@ class ProfitLossBloc extends Bloc<ProfitLossEvent, ProfitLossState> {
dateFrom: event.startDate, dateFrom: event.startDate,
dateTo: event.endDate, dateTo: event.endDate,
); );
result.fold((l) => emit(_Error(l)), (r) => emit(_Success(r.data!))); result.fold((l) => emit(_Error(l)), (r) => emit(_Success(r.data)));
}); });
} }
} }
@@ -1,63 +0,0 @@
import 'package:bloc/bloc.dart';
import 'package:enaklo_pos/data/datasources/analytic_remote_datasource.dart';
import 'package:enaklo_pos/data/datasources/outlet_local_datasource.dart';
import 'package:enaklo_pos/data/models/response/category_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/payment_method_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/product_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/profit_loss_response_model.dart';
import 'package:enaklo_pos/presentation/home/models/outlet_model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'report_event.dart';
part 'report_state.dart';
part 'report_bloc.freezed.dart';
class ReportBloc extends Bloc<ReportEvent, ReportState> {
final AnalyticRemoteDatasource _datasource;
ReportBloc(this._datasource) : super(ReportState.initial()) {
on<_Get>((event, emit) async {
emit(_Loading());
final outlet = await OutletLocalDatasource().get();
final category = await _datasource.getCategory(
dateFrom: event.startDate, dateTo: event.endDate);
final product = await _datasource.getProduct(
dateFrom: event.startDate, dateTo: event.endDate);
final paymentMethod = await _datasource.getPaymentMethod(
dateFrom: event.startDate, dateTo: event.endDate);
final profitLoss = await _datasource.getProfitLoss(
dateFrom: event.startDate, dateTo: event.endDate);
if (category.isLeft() ||
product.isLeft() ||
paymentMethod.isLeft() ||
profitLoss.isLeft()) {
emit(_Error());
}
emit(_Loaded(
outlet,
category
.getOrElse(
() => CategoryAnalyticResponseModel(success: false, data: null))
.data!,
profitLoss
.getOrElse(
() => ProfitLossResponseModel(success: false, data: null))
.data,
paymentMethod
.getOrElse(() =>
PaymentMethodAnalyticResponseModel(success: false, data: null))
.data,
product
.getOrElse(
() => ProductAnalyticResponseModel(success: false, data: null))
.data,
));
});
}
}
@@ -1,975 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'report_bloc.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
/// @nodoc
mixin _$ReportEvent {
DateTime get startDate => throw _privateConstructorUsedError;
DateTime get endDate => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime startDate, DateTime endDate) get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime startDate, DateTime endDate)? get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime startDate, DateTime endDate)? get,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Get value) get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Get value)? get,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Get value)? get,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
/// Create a copy of ReportEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$ReportEventCopyWith<ReportEvent> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $ReportEventCopyWith<$Res> {
factory $ReportEventCopyWith(
ReportEvent value, $Res Function(ReportEvent) then) =
_$ReportEventCopyWithImpl<$Res, ReportEvent>;
@useResult
$Res call({DateTime startDate, DateTime endDate});
}
/// @nodoc
class _$ReportEventCopyWithImpl<$Res, $Val extends ReportEvent>
implements $ReportEventCopyWith<$Res> {
_$ReportEventCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of ReportEvent
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? startDate = null,
Object? endDate = null,
}) {
return _then(_value.copyWith(
startDate: null == startDate
? _value.startDate
: startDate // ignore: cast_nullable_to_non_nullable
as DateTime,
endDate: null == endDate
? _value.endDate
: endDate // ignore: cast_nullable_to_non_nullable
as DateTime,
) as $Val);
}
}
/// @nodoc
abstract class _$$GetImplCopyWith<$Res> implements $ReportEventCopyWith<$Res> {
factory _$$GetImplCopyWith(_$GetImpl value, $Res Function(_$GetImpl) then) =
__$$GetImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({DateTime startDate, DateTime endDate});
}
/// @nodoc
class __$$GetImplCopyWithImpl<$Res>
extends _$ReportEventCopyWithImpl<$Res, _$GetImpl>
implements _$$GetImplCopyWith<$Res> {
__$$GetImplCopyWithImpl(_$GetImpl _value, $Res Function(_$GetImpl) _then)
: super(_value, _then);
/// Create a copy of ReportEvent
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? startDate = null,
Object? endDate = null,
}) {
return _then(_$GetImpl(
startDate: null == startDate
? _value.startDate
: startDate // ignore: cast_nullable_to_non_nullable
as DateTime,
endDate: null == endDate
? _value.endDate
: endDate // ignore: cast_nullable_to_non_nullable
as DateTime,
));
}
}
/// @nodoc
class _$GetImpl implements _Get {
const _$GetImpl({required this.startDate, required this.endDate});
@override
final DateTime startDate;
@override
final DateTime endDate;
@override
String toString() {
return 'ReportEvent.get(startDate: $startDate, endDate: $endDate)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$GetImpl &&
(identical(other.startDate, startDate) ||
other.startDate == startDate) &&
(identical(other.endDate, endDate) || other.endDate == endDate));
}
@override
int get hashCode => Object.hash(runtimeType, startDate, endDate);
/// Create a copy of ReportEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$GetImplCopyWith<_$GetImpl> get copyWith =>
__$$GetImplCopyWithImpl<_$GetImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime startDate, DateTime endDate) get,
}) {
return get(startDate, endDate);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime startDate, DateTime endDate)? get,
}) {
return get?.call(startDate, endDate);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime startDate, DateTime endDate)? get,
required TResult orElse(),
}) {
if (get != null) {
return get(startDate, endDate);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Get value) get,
}) {
return get(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Get value)? get,
}) {
return get?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Get value)? get,
required TResult orElse(),
}) {
if (get != null) {
return get(this);
}
return orElse();
}
}
abstract class _Get implements ReportEvent {
const factory _Get(
{required final DateTime startDate,
required final DateTime endDate}) = _$GetImpl;
@override
DateTime get startDate;
@override
DateTime get endDate;
/// Create a copy of ReportEvent
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$GetImplCopyWith<_$GetImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
mixin _$ReportState {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)
loaded,
required TResult Function() error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult? Function()? error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult Function()? error,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $ReportStateCopyWith<$Res> {
factory $ReportStateCopyWith(
ReportState value, $Res Function(ReportState) then) =
_$ReportStateCopyWithImpl<$Res, ReportState>;
}
/// @nodoc
class _$ReportStateCopyWithImpl<$Res, $Val extends ReportState>
implements $ReportStateCopyWith<$Res> {
_$ReportStateCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of ReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
abstract class _$$InitialImplCopyWith<$Res> {
factory _$$InitialImplCopyWith(
_$InitialImpl value, $Res Function(_$InitialImpl) then) =
__$$InitialImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$InitialImplCopyWithImpl<$Res>
extends _$ReportStateCopyWithImpl<$Res, _$InitialImpl>
implements _$$InitialImplCopyWith<$Res> {
__$$InitialImplCopyWithImpl(
_$InitialImpl _value, $Res Function(_$InitialImpl) _then)
: super(_value, _then);
/// Create a copy of ReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$InitialImpl implements _Initial {
const _$InitialImpl();
@override
String toString() {
return 'ReportState.initial()';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$InitialImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)
loaded,
required TResult Function() error,
}) {
return initial();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult? Function()? error,
}) {
return initial?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult Function()? error,
required TResult orElse(),
}) {
if (initial != null) {
return initial();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return initial(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return initial?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (initial != null) {
return initial(this);
}
return orElse();
}
}
abstract class _Initial implements ReportState {
const factory _Initial() = _$InitialImpl;
}
/// @nodoc
abstract class _$$LoadingImplCopyWith<$Res> {
factory _$$LoadingImplCopyWith(
_$LoadingImpl value, $Res Function(_$LoadingImpl) then) =
__$$LoadingImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$LoadingImplCopyWithImpl<$Res>
extends _$ReportStateCopyWithImpl<$Res, _$LoadingImpl>
implements _$$LoadingImplCopyWith<$Res> {
__$$LoadingImplCopyWithImpl(
_$LoadingImpl _value, $Res Function(_$LoadingImpl) _then)
: super(_value, _then);
/// Create a copy of ReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$LoadingImpl implements _Loading {
const _$LoadingImpl();
@override
String toString() {
return 'ReportState.loading()';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$LoadingImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)
loaded,
required TResult Function() error,
}) {
return loading();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult? Function()? error,
}) {
return loading?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult Function()? error,
required TResult orElse(),
}) {
if (loading != null) {
return loading();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return loading(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return loading?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (loading != null) {
return loading(this);
}
return orElse();
}
}
abstract class _Loading implements ReportState {
const factory _Loading() = _$LoadingImpl;
}
/// @nodoc
abstract class _$$LoadedImplCopyWith<$Res> {
factory _$$LoadedImplCopyWith(
_$LoadedImpl value, $Res Function(_$LoadedImpl) then) =
__$$LoadedImplCopyWithImpl<$Res>;
@useResult
$Res call(
{Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData});
}
/// @nodoc
class __$$LoadedImplCopyWithImpl<$Res>
extends _$ReportStateCopyWithImpl<$Res, _$LoadedImpl>
implements _$$LoadedImplCopyWith<$Res> {
__$$LoadedImplCopyWithImpl(
_$LoadedImpl _value, $Res Function(_$LoadedImpl) _then)
: super(_value, _then);
/// Create a copy of ReportState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? outlet = null,
Object? categoryAnalyticData = freezed,
Object? profitLossData = freezed,
Object? paymentMethodAnalyticData = freezed,
Object? productAnalyticData = freezed,
}) {
return _then(_$LoadedImpl(
null == outlet
? _value.outlet
: outlet // ignore: cast_nullable_to_non_nullable
as Outlet,
freezed == categoryAnalyticData
? _value.categoryAnalyticData
: categoryAnalyticData // ignore: cast_nullable_to_non_nullable
as CategoryAnalyticData?,
freezed == profitLossData
? _value.profitLossData
: profitLossData // ignore: cast_nullable_to_non_nullable
as ProfitLossData?,
freezed == paymentMethodAnalyticData
? _value.paymentMethodAnalyticData
: paymentMethodAnalyticData // ignore: cast_nullable_to_non_nullable
as PaymentMethodAnalyticData?,
freezed == productAnalyticData
? _value.productAnalyticData
: productAnalyticData // ignore: cast_nullable_to_non_nullable
as ProductAnalyticData?,
));
}
}
/// @nodoc
class _$LoadedImpl implements _Loaded {
const _$LoadedImpl(
this.outlet,
this.categoryAnalyticData,
this.profitLossData,
this.paymentMethodAnalyticData,
this.productAnalyticData);
@override
final Outlet outlet;
@override
final CategoryAnalyticData? categoryAnalyticData;
@override
final ProfitLossData? profitLossData;
@override
final PaymentMethodAnalyticData? paymentMethodAnalyticData;
@override
final ProductAnalyticData? productAnalyticData;
@override
String toString() {
return 'ReportState.loaded(outlet: $outlet, categoryAnalyticData: $categoryAnalyticData, profitLossData: $profitLossData, paymentMethodAnalyticData: $paymentMethodAnalyticData, productAnalyticData: $productAnalyticData)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$LoadedImpl &&
(identical(other.outlet, outlet) || other.outlet == outlet) &&
(identical(other.categoryAnalyticData, categoryAnalyticData) ||
other.categoryAnalyticData == categoryAnalyticData) &&
(identical(other.profitLossData, profitLossData) ||
other.profitLossData == profitLossData) &&
(identical(other.paymentMethodAnalyticData,
paymentMethodAnalyticData) ||
other.paymentMethodAnalyticData == paymentMethodAnalyticData) &&
(identical(other.productAnalyticData, productAnalyticData) ||
other.productAnalyticData == productAnalyticData));
}
@override
int get hashCode => Object.hash(runtimeType, outlet, categoryAnalyticData,
profitLossData, paymentMethodAnalyticData, productAnalyticData);
/// Create a copy of ReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$LoadedImplCopyWith<_$LoadedImpl> get copyWith =>
__$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)
loaded,
required TResult Function() error,
}) {
return loaded(outlet, categoryAnalyticData, profitLossData,
paymentMethodAnalyticData, productAnalyticData);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult? Function()? error,
}) {
return loaded?.call(outlet, categoryAnalyticData, profitLossData,
paymentMethodAnalyticData, productAnalyticData);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult Function()? error,
required TResult orElse(),
}) {
if (loaded != null) {
return loaded(outlet, categoryAnalyticData, profitLossData,
paymentMethodAnalyticData, productAnalyticData);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return loaded(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return loaded?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (loaded != null) {
return loaded(this);
}
return orElse();
}
}
abstract class _Loaded implements ReportState {
const factory _Loaded(
final Outlet outlet,
final CategoryAnalyticData? categoryAnalyticData,
final ProfitLossData? profitLossData,
final PaymentMethodAnalyticData? paymentMethodAnalyticData,
final ProductAnalyticData? productAnalyticData) = _$LoadedImpl;
Outlet get outlet;
CategoryAnalyticData? get categoryAnalyticData;
ProfitLossData? get profitLossData;
PaymentMethodAnalyticData? get paymentMethodAnalyticData;
ProductAnalyticData? get productAnalyticData;
/// Create a copy of ReportState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$LoadedImplCopyWith<_$LoadedImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class _$$ErrorImplCopyWith<$Res> {
factory _$$ErrorImplCopyWith(
_$ErrorImpl value, $Res Function(_$ErrorImpl) then) =
__$$ErrorImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$ErrorImplCopyWithImpl<$Res>
extends _$ReportStateCopyWithImpl<$Res, _$ErrorImpl>
implements _$$ErrorImplCopyWith<$Res> {
__$$ErrorImplCopyWithImpl(
_$ErrorImpl _value, $Res Function(_$ErrorImpl) _then)
: super(_value, _then);
/// Create a copy of ReportState
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$ErrorImpl implements _Error {
const _$ErrorImpl();
@override
String toString() {
return 'ReportState.error()';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$ErrorImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)
loaded,
required TResult Function() error,
}) {
return error();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult? Function()? error,
}) {
return error?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData)?
loaded,
TResult Function()? error,
required TResult orElse(),
}) {
if (error != null) {
return error();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Initial value) initial,
required TResult Function(_Loading value) loading,
required TResult Function(_Loaded value) loaded,
required TResult Function(_Error value) error,
}) {
return error(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Initial value)? initial,
TResult? Function(_Loading value)? loading,
TResult? Function(_Loaded value)? loaded,
TResult? Function(_Error value)? error,
}) {
return error?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Initial value)? initial,
TResult Function(_Loading value)? loading,
TResult Function(_Loaded value)? loaded,
TResult Function(_Error value)? error,
required TResult orElse(),
}) {
if (error != null) {
return error(this);
}
return orElse();
}
}
abstract class _Error implements ReportState {
const factory _Error() = _$ErrorImpl;
}
@@ -1,9 +0,0 @@
part of 'report_bloc.dart';
@freezed
class ReportEvent with _$ReportEvent {
const factory ReportEvent.get({
required DateTime startDate,
required DateTime endDate,
}) = _Get;
}
@@ -1,15 +0,0 @@
part of 'report_bloc.dart';
@freezed
class ReportState with _$ReportState {
const factory ReportState.initial() = _Initial;
const factory ReportState.loading() = _Loading;
const factory ReportState.loaded(
Outlet outlet,
CategoryAnalyticData? categoryAnalyticData,
ProfitLossData? profitLossData,
PaymentMethodAnalyticData? paymentMethodAnalyticData,
ProductAnalyticData? productAnalyticData,
) = _Loaded;
const factory ReportState.error() = _Error;
}
+42 -260
View File
@@ -1,20 +1,12 @@
import 'dart:developer'; import 'dart:developer';
import 'package:enaklo_pos/core/components/date_range_picker.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/core/utils/helper_pdf_service.dart';
import 'package:enaklo_pos/core/utils/permession_handler.dart';
import 'package:enaklo_pos/core/utils/transaction_report.dart';
import 'package:enaklo_pos/presentation/report/blocs/category_report/category_report_bloc.dart';
import 'package:enaklo_pos/presentation/report/blocs/inventory_report/inventory_report_bloc.dart';
import 'package:enaklo_pos/presentation/report/blocs/profit_loss/profit_loss_bloc.dart'; import 'package:enaklo_pos/presentation/report/blocs/profit_loss/profit_loss_bloc.dart';
import 'package:enaklo_pos/presentation/report/blocs/report/report_bloc.dart';
import 'package:enaklo_pos/presentation/report/widgets/category_report_widget.dart';
import 'package:enaklo_pos/presentation/report/widgets/dashboard_analytic_widget.dart'; import 'package:enaklo_pos/presentation/report/widgets/dashboard_analytic_widget.dart';
import 'package:enaklo_pos/presentation/report/widgets/inventory_report_widget.dart';
import 'package:enaklo_pos/presentation/report/widgets/profit_loss_widget.dart'; import 'package:enaklo_pos/presentation/report/widgets/profit_loss_widget.dart';
import 'package:enaklo_pos/presentation/sales/pages/sales_page.dart'; import 'package:enaklo_pos/presentation/sales/pages/sales_page.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:enaklo_pos/core/components/custom_date_picker.dart';
import 'package:enaklo_pos/core/constants/colors.dart'; import 'package:enaklo_pos/core/constants/colors.dart';
import 'package:enaklo_pos/core/extensions/date_time_ext.dart'; import 'package:enaklo_pos/core/extensions/date_time_ext.dart';
import 'package:enaklo_pos/core/utils/date_formatter.dart'; import 'package:enaklo_pos/core/utils/date_formatter.dart';
@@ -52,180 +44,58 @@ class _ReportPageState extends State<ReportPage> {
context.read<SummaryBloc>().add( context.read<SummaryBloc>().add(
SummaryEvent.getSummary(fromDate, toDate), SummaryEvent.getSummary(fromDate, toDate),
); );
context.read<ReportBloc>().add(
ReportEvent.get(startDate: fromDate, endDate: toDate),
);
}
onDateChanged(DateTime? startDate, DateTime? endDate) {
setState(() {
fromDate = startDate ?? fromDate;
toDate = endDate ?? toDate;
});
context.read<ReportBloc>().add(
ReportEvent.get(startDate: fromDate, endDate: toDate),
);
if (selectedMenu == 0) {
context.read<SummaryBloc>().add(
SummaryEvent.getSummary(fromDate, toDate),
);
}
if (selectedMenu == 2) {
context.read<ItemSalesReportBloc>().add(
ItemSalesReportEvent.getItemSales(
startDate: fromDate, endDate: toDate),
);
}
if (selectedMenu == 3) {
context.read<ProductSalesBloc>().add(
ProductSalesEvent.getProductSales(
fromDate,
toDate,
),
);
}
if (selectedMenu == 4) {
context.read<PaymentMethodReportBloc>().add(
PaymentMethodReportEvent.getPaymentMethodReport(
startDate: fromDate,
endDate: toDate,
),
);
}
if (selectedMenu == 5) {
context.read<ProfitLossBloc>().add(
ProfitLossEvent.getProfitLoss(
fromDate,
toDate,
),
);
}
if (selectedMenu == 6) {
context.read<InventoryReportBloc>().add(
InventoryReportEvent.get(
startDate: fromDate,
endDate: toDate,
),
);
}
if (selectedMenu == 7) {
context.read<CategoryReportBloc>().add(
CategoryReportEvent.get(
startDate: fromDate,
endDate: toDate,
),
);
}
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String searchDateFormatted = String searchDateFormatted =
'${fromDate.toFormattedDate2()} - ${toDate.toFormattedDate2()}'; '${fromDate.toFormattedDate2()} to ${toDate.toFormattedDate2()}';
return Scaffold( return Scaffold(
backgroundColor: AppColors.background, backgroundColor: AppColors.background,
body: Column( body: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ReportTitle( ReportTitle(
searchDateFormatted: searchDateFormatted,
actionWidget: [ actionWidget: [
InkWell( SizedBox(
onTap: () { width: 300,
DateRangePickerModal.show( child: CustomDatePicker(
context: context, prefix: const Text('From: '),
initialEndDate: toDate, initialDate: fromDate,
initialStartDate: fromDate, onDateSelected: (selectedDate) {
primaryColor: AppColors.primary, fromDate = selectedDate;
onChanged: onDateChanged,
); setState(() {});
}, },
child: Container(
padding:
EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.0),
border: Border.all(
color: AppColors.stroke,
)),
child: Icon(
Icons.calendar_month_outlined,
color: AppColors.primary,
size: 28,
),
), ),
), ),
const SpaceWidth(12.0), const SpaceWidth(24.0),
BlocBuilder<ReportBloc, ReportState>( SizedBox(
builder: (context, state) { width: 300,
return state.maybeWhen( child: CustomDatePicker(
orElse: () => SizedBox.shrink(), prefix: const Text('To: '),
loading: () => SizedBox( initialDate: toDate,
height: 24, onDateSelected: (selectedDate) {
width: 24, toDate = selectedDate;
child: const CircularProgressIndicator(), setState(() {});
), // context.read<TransactionReportBloc>().add(
loaded: (outlet, categoryAnalyticData, profitLossData, // TransactionReportEvent.getReport(
paymentMethodAnalyticData, productAnalyticData) => // startDate:
InkWell( // DateFormatter.formatDateTime(
onTap: () async { // fromDate),
try { // endDate: DateFormatter.formatDateTime(
final status = // toDate)),
await PermessionHelper().checkPermission(); // );
if (status) { // context.read<ItemSalesReportBloc>().add(
final pdfFile = await TransactionReport.previewPdf( // ItemSalesReportEvent.getItemSales(
outlet: outlet, // startDate:
searchDateFormatted: searchDateFormatted, // DateFormatter.formatDateTime(
categoryAnalyticData: categoryAnalyticData, // fromDate),
profitLossData: profitLossData, // endDate: DateFormatter.formatDateTime(
paymentMethodAnalyticData: // toDate)),
paymentMethodAnalyticData, // );
productAnalyticData: productAnalyticData, },
); ),
log("pdfFile: $pdfFile");
await HelperPdfService.openFile(pdfFile);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'Storage permission is required to save PDF'),
backgroundColor: Colors.red,
),
);
}
} catch (e) {
log("Error generating PDF: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Failed to generate PDF: $e'),
backgroundColor: Colors.red,
),
);
}
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 12.0, vertical: 8.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.0),
border: Border.all(
color: AppColors.stroke,
)),
child: Icon(
Icons.download,
color: AppColors.primary,
size: 28,
),
),
),
);
},
), ),
], ],
), ),
@@ -324,12 +194,12 @@ class _ReportPageState extends State<ReportPage> {
isActive: selectedMenu == 4, isActive: selectedMenu == 4,
), ),
ReportMenu( ReportMenu(
label: 'Laporan Untung Rugi', label: 'Laporan untung rugi',
subtitle: 'Laporan untung rugi penjualan.', subtitle: 'Laporan untung rugi penjualan.',
icon: Icons.trending_down, icon: Icons.trending_down,
onPressed: () { onPressed: () {
selectedMenu = 5; selectedMenu = 5;
title = 'Laporan Untung Rugi'; title = 'Laporan untung rugi';
setState(() {}); setState(() {});
context.read<ProfitLossBloc>().add( context.read<ProfitLossBloc>().add(
ProfitLossEvent.getProfitLoss( ProfitLossEvent.getProfitLoss(
@@ -340,40 +210,6 @@ class _ReportPageState extends State<ReportPage> {
}, },
isActive: selectedMenu == 5, isActive: selectedMenu == 5,
), ),
ReportMenu(
label: 'Laporan Inventori',
subtitle: 'Laporan inventori produk',
icon: Icons.archive_outlined,
onPressed: () {
selectedMenu = 6;
title = 'Laporan Inventori';
setState(() {});
context.read<InventoryReportBloc>().add(
InventoryReportEvent.get(
startDate: fromDate,
endDate: toDate,
),
);
},
isActive: selectedMenu == 6,
),
ReportMenu(
label: 'Laporan Kategori',
subtitle: 'Laporan kategori produk',
icon: Icons.category_outlined,
onPressed: () {
selectedMenu = 7;
title = 'Laporan Kategori';
setState(() {});
context.read<CategoryReportBloc>().add(
CategoryReportEvent.get(
startDate: fromDate,
endDate: toDate,
),
);
},
isActive: selectedMenu == 7,
),
], ],
), ),
), ),
@@ -524,61 +360,7 @@ class _ReportPageState extends State<ReportPage> {
); );
}, },
) )
: selectedMenu == 6 : const SizedBox.shrink()),
? BlocBuilder<
InventoryReportBloc,
InventoryReportState>(
builder: (context, state) {
return state.maybeWhen(
orElse: () =>
const Center(
child:
CircularProgressIndicator(),
),
error: (message) {
return Text(message);
},
loaded: (data) {
return InventoryReportWidget(
title: title,
searchDateFormatted:
searchDateFormatted,
inventory: data,
);
},
);
},
)
: selectedMenu == 7
? BlocBuilder<
CategoryReportBloc,
CategoryReportState>(
builder:
(context, state) {
return state
.maybeWhen(
orElse: () =>
const Center(
child:
CircularProgressIndicator(),
),
error: (message) {
return Text(
message);
},
loaded: (data) {
return CategoryReportWidget(
title: title,
searchDateFormatted:
searchDateFormatted,
categoryAnalyticData:
data,
);
},
);
},
)
: const SizedBox.shrink()),
], ],
), ),
), ),
@@ -1,292 +0,0 @@
import 'package:enaklo_pos/core/constants/colors.dart';
import 'package:enaklo_pos/data/models/response/category_analytic_response_model.dart';
import 'package:flutter/material.dart';
class CategoryReportWidget extends StatelessWidget {
final String title;
final String searchDateFormatted;
final CategoryAnalyticData categoryAnalyticData;
const CategoryReportWidget({
super.key,
required this.title,
required this.searchDateFormatted,
required this.categoryAnalyticData,
});
String formatCurrency(int amount) {
return 'Rp ${amount.toString().replaceAllMapped(
RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'),
(Match m) => '${m[1]}.',
)}';
}
int getTotalRevenue() {
return categoryAnalyticData.data
.fold(0, (sum, item) => sum + item.totalRevenue);
}
int getTotalQuantity() {
return categoryAnalyticData.data
.fold(0, (sum, item) => sum + item.totalQuantity);
}
int getTotalOrders() {
return categoryAnalyticData.data
.fold(0, (sum, item) => sum + item.orderCount);
}
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
color: AppColors.background,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Header Section
Container(
width: double.infinity,
color: AppColors.primary,
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: AppColors.whiteText,
),
),
const SizedBox(height: 8),
Text(
'Periode: $searchDateFormatted',
style: TextStyle(
fontSize: 14,
color: AppColors.whiteText.withOpacity(0.8),
),
),
],
),
),
// Summary Cards Section
Container(
color: AppColors.white,
padding: const EdgeInsets.all(20),
child: Row(
children: [
Expanded(
child: _buildSummaryCard(
'Total Pendapatan',
formatCurrency(getTotalRevenue()),
AppColors.green,
),
),
const SizedBox(width: 16),
Expanded(
child: _buildSummaryCard(
'Total Item Terjual',
'${getTotalQuantity()} pcs',
AppColors.subtitle,
),
),
const SizedBox(width: 16),
Expanded(
child: _buildSummaryCard(
'Total Pesanan',
'${getTotalOrders()}',
AppColors.primary,
),
),
],
),
),
// Categories List Header
Container(
color: AppColors.stroke,
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16),
child: Row(
children: [
Expanded(
flex: 3,
child: Text(
'Kategori',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.black,
),
),
),
Expanded(
flex: 2,
child: Text(
'Pendapatan',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.black,
),
),
),
Expanded(
flex: 1,
child: Text(
'Qty',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.black,
),
),
),
Expanded(
flex: 1,
child: Text(
'Order',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.black,
),
),
),
],
),
),
// Categories List
Expanded(
child: Container(
color: AppColors.white,
child: ListView.builder(
padding: EdgeInsets.zero,
itemCount: categoryAnalyticData.data.length,
itemBuilder: (context, index) {
return _buildCategoryItem(
categoryAnalyticData.data[index], index);
},
),
),
),
],
),
);
}
Widget _buildSummaryCard(String title, String value, Color color) {
return Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: AppColors.light,
borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColors.stroke, width: 1),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(
fontSize: 12,
color: AppColors.subtitle,
fontWeight: FontWeight.w500,
),
),
const SizedBox(height: 8),
Text(
value,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: color,
),
),
],
),
);
}
Widget _buildCategoryItem(CategoryAnalyticItem category, int index) {
final isEven = index % 2 == 0;
return Container(
color: isEven ? AppColors.white : AppColors.light.withOpacity(0.3),
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16),
child: Row(
children: [
Expanded(
flex: 3,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
category.categoryName,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.black,
),
),
const SizedBox(height: 4),
Text(
'${category.productCount} produk',
style: TextStyle(
fontSize: 12,
color: AppColors.subtitle,
),
),
],
),
),
Expanded(
flex: 2,
child: Column(
children: [
Text(
formatCurrency(category.totalRevenue),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: AppColors.green,
),
),
],
),
),
Expanded(
flex: 1,
child: Text(
'${category.totalQuantity}',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
color: AppColors.black,
),
),
),
Expanded(
flex: 1,
child: Text(
'${category.orderCount}',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
color: AppColors.black,
),
),
),
],
),
);
}
}
@@ -1,616 +0,0 @@
import 'dart:developer';
import 'package:enaklo_pos/core/constants/colors.dart';
import 'package:enaklo_pos/core/extensions/string_ext.dart';
import 'package:enaklo_pos/core/utils/helper_pdf_service.dart';
import 'package:enaklo_pos/core/utils/inventory_report.dart';
import 'package:enaklo_pos/core/utils/permession_handler.dart';
import 'package:enaklo_pos/data/models/response/inventory_analytic_response_model.dart';
import 'package:flutter/material.dart';
class InventoryReportWidget extends StatefulWidget {
final String title;
final String searchDateFormatted;
final InventoryAnalyticData inventory;
const InventoryReportWidget({
super.key,
required this.title,
required this.searchDateFormatted,
required this.inventory,
});
@override
State<InventoryReportWidget> createState() => _InventoryReportWidgetState();
}
class _InventoryReportWidgetState extends State<InventoryReportWidget> {
int _selectedTabIndex = 0;
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: BoxDecoration(
color: AppColors.white,
border: Border.all(color: AppColors.stroke, width: 1),
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Report Header
Container(
width: double.infinity,
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: AppColors.light,
border: Border(
bottom: BorderSide(color: AppColors.stroke, width: 1),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
widget.title,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: AppColors.primary,
),
),
const SizedBox(height: 4),
Text(
widget.searchDateFormatted,
style: TextStyle(
fontSize: 12,
color: AppColors.greyDark,
),
),
],
),
Row(
children: [
// Download Button
GestureDetector(
onTap: () async {
try {
final status =
await PermessionHelper().checkPermission();
if (status) {
final pdfFile = await InventoryReport.previewPdf(
searchDateFormatted: widget.searchDateFormatted,
inventory: widget.inventory,
);
log("pdfFile: $pdfFile");
await HelperPdfService.openFile(pdfFile);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'Storage permission is required to save PDF'),
backgroundColor: Colors.red,
),
);
}
} catch (e) {
log("Error generating PDF: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Failed to generate PDF: $e'),
backgroundColor: Colors.red,
),
);
}
},
child: Container(
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: AppColors.primary.withOpacity(0.1),
borderRadius: BorderRadius.circular(8),
border:
Border.all(color: AppColors.primary, width: 1),
),
child: Icon(
Icons.download_outlined,
size: 18,
color: AppColors.primary,
),
),
),
const SizedBox(width: 12),
// Status Badge
Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
decoration: BoxDecoration(
color: AppColors.green.withOpacity(0.1),
borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColors.green, width: 1),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.check_circle,
size: 14,
color: AppColors.green,
),
const SizedBox(width: 6),
Text(
'Aktif',
style: TextStyle(
fontSize: 12,
color: AppColors.green,
fontWeight: FontWeight.w600,
),
),
],
),
),
],
),
],
),
),
// Summary Section
Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(
Icons.analytics_outlined,
size: 20,
color: AppColors.primary,
),
const SizedBox(width: 8),
Text(
'Ringkasan Inventori',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: AppColors.black,
),
),
],
),
const SizedBox(height: 16),
// Summary Grid
GridView.count(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
crossAxisCount: 3,
childAspectRatio: 2.2,
mainAxisSpacing: 12,
crossAxisSpacing: 12,
children: [
_buildSummaryCard(
'Total Produk',
(widget.inventory.summary.totalProducts).toString(),
AppColors.primary,
Icons.inventory_2_outlined,
),
_buildSummaryCard(
'Total Bahan',
widget.inventory.summary.totalIngredients.toString(),
AppColors.subtitle,
Icons.list_alt_outlined,
),
_buildSummaryCard(
'Total Nilai',
widget.inventory.summary.totalValue
.toString()
.currencyFormatRpV2,
AppColors.green,
Icons.monetization_on_outlined,
),
],
),
],
),
),
// Divider
Container(
height: 1,
margin: const EdgeInsets.symmetric(horizontal: 20),
color: AppColors.stroke,
),
// Tabs
Container(
padding: const EdgeInsets.all(20),
child: Row(
children: [
_buildTab('Produk', 0),
const SizedBox(width: 12),
_buildTab('Bahan Baku', 1),
],
),
),
// Content based on selected tab
_selectedTabIndex == 0
? _buildProductsContent()
: _buildIngredientsContent(),
],
),
),
);
}
Widget _buildSummaryCard(
String title, String value, Color color, IconData icon) {
return Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: color.withOpacity(0.08),
borderRadius: BorderRadius.circular(10),
border: Border.all(color: color.withOpacity(0.2), width: 1),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
children: [
Container(
padding: const EdgeInsets.all(4),
decoration: BoxDecoration(
color: color.withOpacity(0.1),
borderRadius: BorderRadius.circular(6),
),
child: Icon(
icon,
size: 16,
color: color,
),
),
const SizedBox(width: 8),
Expanded(
child: Text(
title,
style: TextStyle(
fontSize: 10,
color: AppColors.greyDark,
fontWeight: FontWeight.w500,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
const SizedBox(height: 6),
Text(
value,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: color,
),
),
],
),
);
}
Widget _buildTab(String title, int index) {
bool isActive = _selectedTabIndex == index;
return GestureDetector(
onTap: () {
setState(() {
_selectedTabIndex = index;
});
},
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
decoration: BoxDecoration(
color: isActive ? AppColors.primary : AppColors.white,
borderRadius: BorderRadius.circular(25),
border: Border.all(
color: isActive ? AppColors.primary : AppColors.stroke,
width: 1,
),
),
child: Text(
title,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: isActive ? AppColors.whiteText : AppColors.greyDark,
),
),
),
);
}
Widget _buildProductsContent() {
return Container(
margin: const EdgeInsets.fromLTRB(20, 0, 20, 20),
child: Column(
children: [
Container(
decoration: BoxDecoration(
color: AppColors.primary, // Purple color
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8),
topRight: Radius.circular(8),
),
),
child: Table(
columnWidths: const {
0: FlexColumnWidth(2.5), // Produk
1: FlexColumnWidth(2), // Kategori
2: FlexColumnWidth(1), // Stock
3: FlexColumnWidth(2), // Masuk
4: FlexColumnWidth(2), // Keluar
},
children: [
TableRow(
children: [
_buildHeaderCell('Nama'),
_buildHeaderCell('Kategori'),
_buildHeaderCell('Stock'),
_buildHeaderCell('Masuk'),
_buildHeaderCell('Keluar'),
],
),
],
),
),
Container(
decoration: BoxDecoration(
color: AppColors.white,
),
child: Table(
columnWidths: {
0: FlexColumnWidth(2.5), // Produk
1: FlexColumnWidth(2), // Kategori
2: FlexColumnWidth(1), // Stock
3: FlexColumnWidth(2), // Masuk
4: FlexColumnWidth(2), // Keluar
},
children: widget.inventory.products
.map((item) => _buildProductDataRow(
item,
widget.inventory.products.indexOf(item) % 2 == 0,
))
.toList(),
),
),
Container(
decoration: BoxDecoration(
color: AppColors.primary, // Purple color
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(8),
bottomRight: Radius.circular(8),
),
),
child: Table(
columnWidths: const {
0: FlexColumnWidth(2.5), // Produk
1: FlexColumnWidth(2), // Kategori
2: FlexColumnWidth(1), // Stock
3: FlexColumnWidth(2), // Masuk
4: FlexColumnWidth(2), // Keluar
},
children: [
TableRow(
children: [
_buildTotalCell('TOTAL'),
_buildTotalCell(''),
_buildTotalCell(
(widget.inventory.products.fold<num>(
0, (sum, item) => sum + (item.quantity))).toString(),
),
_buildTotalCell(
(widget.inventory.products.fold<num>(
0, (sum, item) => sum + (item.totalIn))).toString(),
),
_buildTotalCell(
(widget.inventory.products.fold<num>(
0, (sum, item) => sum + (item.totalOut))).toString(),
),
],
),
],
),
),
],
),
);
}
Widget _buildIngredientsContent() {
return Container(
margin: const EdgeInsets.fromLTRB(20, 0, 20, 20),
child: Column(
children: [
Container(
decoration: BoxDecoration(
color: AppColors.primary, // Purple color
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8),
topRight: Radius.circular(8),
),
),
child: Table(
columnWidths: const {
0: FlexColumnWidth(2.5), // Name
1: FlexColumnWidth(1), // Stock
2: FlexColumnWidth(2), // Masuk
3: FlexColumnWidth(2), // Keluar
},
children: [
TableRow(
children: [
_buildHeaderCell('Nama'),
_buildHeaderCell('Stock'),
_buildHeaderCell('Masuk'),
_buildHeaderCell('Keluar'),
],
),
],
),
),
Container(
decoration: BoxDecoration(
color: AppColors.white,
),
child: Table(
columnWidths: {
0: FlexColumnWidth(2.5), // Name
1: FlexColumnWidth(1), // Stock
2: FlexColumnWidth(2), // Masuk
3: FlexColumnWidth(2), // Keluar
},
children: widget.inventory.ingredients
.map((item) => _buildIngredientsDataRow(
item,
widget.inventory.ingredients.indexOf(item) % 2 == 0,
))
.toList(),
),
),
Container(
decoration: BoxDecoration(
color: AppColors.primary, // Purple color
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(8),
bottomRight: Radius.circular(8),
),
),
child: Table(
columnWidths: const {
0: FlexColumnWidth(2.5), // Name
1: FlexColumnWidth(1), // Stock
2: FlexColumnWidth(2), // Masuk
3: FlexColumnWidth(2), // Keluar
},
children: [
TableRow(
children: [
_buildTotalCell('TOTAL'),
_buildTotalCell(
(widget.inventory.ingredients.fold<num>(
0, (sum, item) => sum + (item.quantity))).toString(),
),
_buildTotalCell(
(widget.inventory.ingredients.fold<num>(
0, (sum, item) => sum + (item.totalIn))).toString(),
),
_buildTotalCell(
(widget.inventory.ingredients.fold<num>(
0, (sum, item) => sum + (item.totalOut))).toString(),
),
],
),
],
),
),
],
),
);
}
TableRow _buildProductDataRow(InventoryProductItem product, bool isEven) {
return TableRow(
decoration: BoxDecoration(
color: product.isZeroStock
? Colors.red.shade100
: product.isLowStock
? Colors.yellow.shade100
: isEven
? Colors.grey.shade50
: AppColors.white,
),
children: [
_buildDataCell(product.productName, alignment: Alignment.centerLeft),
_buildDataCell(product.categoryName, alignment: Alignment.centerLeft),
_buildDataCell(product.quantity.toString()),
_buildDataCell(product.totalIn.toString()),
_buildDataCell(product.totalOut.toString()),
],
);
}
TableRow _buildIngredientsDataRow(InventoryIngredientItem item, bool isEven) {
return TableRow(
decoration: BoxDecoration(
color: item.isZeroStock
? Colors.red.shade100
: item.isLowStock
? Colors.yellow.shade100
: isEven
? Colors.grey.shade50
: AppColors.white,
),
children: [
_buildDataCell(item.ingredientName, alignment: Alignment.centerLeft),
_buildDataCell(item.quantity.toString()),
_buildDataCell(item.totalIn.toString()),
_buildDataCell(item.totalOut.toString()),
],
);
}
Widget _buildHeaderCell(String text) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 16),
child: Text(
text,
style: TextStyle(
color: AppColors.white,
fontWeight: FontWeight.bold,
fontSize: 12,
),
textAlign: TextAlign.center,
),
);
}
Widget _buildDataCell(String text,
{Alignment alignment = Alignment.center, Color? textColor}) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 16),
alignment: alignment,
child: Text(
text,
style: TextStyle(
fontSize: 12,
color: textColor ?? AppColors.black,
fontWeight: FontWeight.normal,
),
textAlign: alignment == Alignment.centerLeft
? TextAlign.left
: TextAlign.center,
),
);
}
Widget _buildTotalCell(String text) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 16),
child: Text(
text,
style: TextStyle(
color: AppColors.white,
fontWeight: FontWeight.bold,
fontSize: 12,
),
textAlign: TextAlign.center,
),
);
}
}
@@ -873,7 +873,7 @@ class ProfitLossWidget extends StatelessWidget {
Expanded( Expanded(
child: _buildMetricCard( child: _buildMetricCard(
'Keuntungan Rata-rata', 'Keuntungan Rata-rata',
"${data.summary.averageProfit.round()}%", _formatCurrency(data.summary.averageProfit),
'Per pesanan', 'Per pesanan',
Icons.trending_up, Icons.trending_up,
AppColorProfitLoss.success, AppColorProfitLoss.success,
@@ -1,13 +1,12 @@
import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:enaklo_pos/core/extensions/date_time_ext.dart';
import '../../../core/constants/colors.dart'; import '../../../core/constants/colors.dart';
class ReportTitle extends StatelessWidget { class ReportTitle extends StatelessWidget {
final List<Widget>? actionWidget; final List<Widget>? actionWidget;
final String searchDateFormatted; const ReportTitle({super.key, this.actionWidget});
const ReportTitle(
{super.key, this.actionWidget, required this.searchDateFormatted});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -17,7 +16,7 @@ class ReportTitle extends StatelessWidget {
vertical: 10.0, vertical: 10.0,
), ),
width: double.infinity, width: double.infinity,
height: context.deviceHeight * 0.13, height: context.deviceHeight * 0.1,
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: AppColors.white, color: AppColors.white,
border: Border( border: Border(
@@ -42,7 +41,7 @@ class ReportTitle extends StatelessWidget {
), ),
), ),
Text( Text(
searchDateFormatted, DateTime.now().toFormattedDate2(),
style: TextStyle( style: TextStyle(
color: AppColors.grey, color: AppColors.grey,
fontSize: 14, fontSize: 14,
@@ -52,8 +51,6 @@ class ReportTitle extends StatelessWidget {
), ),
if (actionWidget != null) if (actionWidget != null)
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: actionWidget!, children: actionWidget!,
), ),
], ],
+11 -12
View File
@@ -98,8 +98,8 @@ class _SalesPageState extends State<SalesPage> {
}, },
onDateRangeChanged: (start, end) { onDateRangeChanged: (start, end) {
setState(() { setState(() {
startDate = start ?? startDate; startDate = start;
endDate = end ?? endDate; endDate = end;
}); });
context.read<OrderLoaderBloc>().add( context.read<OrderLoaderBloc>().add(
@@ -246,16 +246,15 @@ class _SalesPageState extends State<SalesPage> {
), ),
], ],
if (widget.status == 'completed') if (widget.status == 'completed')
if (orderDetail?.isRefund == false) Button.outlined(
Button.outlined( onPressed: () {
onPressed: () { context.push(RefundPage(
context.push(RefundPage( selectedOrder: orderDetail!,
selectedOrder: orderDetail!, ));
)); },
}, label: 'Refund',
label: 'Refund', icon: Icon(Icons.autorenew),
icon: Icon(Icons.autorenew), ),
),
], ],
), ),
Expanded( Expanded(
@@ -1,9 +1,9 @@
import 'package:enaklo_pos/core/components/components.dart'; import 'package:enaklo_pos/core/components/components.dart';
import 'package:enaklo_pos/core/components/date_range_picker.dart';
import 'package:enaklo_pos/core/constants/colors.dart'; import 'package:enaklo_pos/core/constants/colors.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/core/extensions/date_time_ext.dart'; import 'package:enaklo_pos/core/extensions/date_time_ext.dart';
import 'package:enaklo_pos/presentation/sales/blocs/order_loader/order_loader_bloc.dart'; import 'package:enaklo_pos/presentation/sales/blocs/order_loader/order_loader_bloc.dart';
import 'package:enaklo_pos/presentation/sales/dialog/filter_dialog.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
@@ -12,7 +12,7 @@ class SalesTitle extends StatelessWidget {
final DateTime startDate; final DateTime startDate;
final DateTime endDate; final DateTime endDate;
final Function(String) onChanged; final Function(String) onChanged;
final void Function(DateTime? start, DateTime? end) onDateRangeChanged; final void Function(DateTime start, DateTime end) onDateRangeChanged;
const SalesTitle( const SalesTitle(
{super.key, {super.key,
@@ -119,12 +119,13 @@ class SalesTitle extends StatelessWidget {
), ),
SpaceWidth(12), SpaceWidth(12),
GestureDetector( GestureDetector(
onTap: () => DateRangePickerModal.show( onTap: () => showDialog(
context: context, context: context,
initialStartDate: startDate, builder: (context) => SalesFilterDialog(
initialEndDate: endDate, startDate: startDate,
primaryColor: AppColors.primary, endDate: endDate,
onChanged: onDateRangeChanged, onDateRangeChanged: onDateRangeChanged,
),
), ),
child: Container( child: Container(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
@@ -160,53 +160,48 @@ class _BarPrinterPageState extends State<BarPrinterPage> {
SpaceHeight(16), SpaceHeight(16),
// button test print // button test print
Button.outlined( Button.outlined(
onPressed: () async { onPressed: () async {
if (addressController!.text.isNotEmpty && if (addressController!.text.isNotEmpty && printNameController!.text.isNotEmpty) {
printNameController!.text.isNotEmpty) { try {
try { // Create a test print model
// Create a test print model final testPrinter = PrintModel(
final testPrinter = PrintModel( code: 'bar',
code: 'bar', name: printNameController!.text,
name: printNameController!.text, address: addressController!.text,
address: addressController!.text, paper: paper,
paper: paper, type: selectedPrinter,
type: selectedPrinter, );
);
// Generate test print data
// Generate test print data final testPrintData = await PrintDataoutputs.instance.printBar(
final testPrintData = [], // Empty product list for test
await PrintDataoutputs.instance.printBar( 'Test Table',
[], // Empty product list for test 'Test Order',
'Test Table', 'Test Cashier',
'Test Order', int.parse(paper),
'Test Cashier', 'DINE IN',
'Test Customer', );
int.parse(paper),
'DINE IN', // Print test
); await PrinterService().printWithPrinter(
testPrinter,
// Print test testPrintData,
await PrinterService().printWithPrinter( context,
testPrinter, );
testPrintData, } catch (e) {
context, log("Error test printing: $e");
);
} catch (e) {
log("Error test printing: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Error test printing: $e')),
);
}
} else {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(content: Text('Error test printing: $e')),
content: Text(
'Please fill in printer details first')),
); );
} }
}, } else {
label: 'Test Print'), ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Please fill in printer details first')),
);
}
},
label: 'Test Print'
),
SpaceHeight(8), SpaceHeight(8),
// button save // button save
data == null data == null
@@ -162,54 +162,48 @@ class _CheckerPrinterPageState extends State<CheckerPrinterPage> {
SpaceHeight(16), SpaceHeight(16),
// button test print // button test print
Button.outlined( Button.outlined(
onPressed: () async { onPressed: () async {
if (addressController!.text.isNotEmpty && if (addressController!.text.isNotEmpty && printNameController!.text.isNotEmpty) {
printNameController!.text.isNotEmpty) { try {
try { // Create a test print model
// Create a test print model final testPrinter = PrintModel(
final testPrinter = PrintModel( code: 'checker',
code: 'checker', name: printNameController!.text,
name: printNameController!.text, address: addressController!.text,
address: addressController!.text, paper: paper,
paper: paper, type: selectedPrinter,
type: selectedPrinter, );
);
// Generate test print data
// Generate test print data final testPrintData = await PrintDataoutputs.instance.printChecker(
final testPrintData = await PrintDataoutputs [], // Empty product list for test
.instance 'Test Table',
.printChecker( 'Test Order',
[], // Empty product list for test 'Test Cashier',
'Test Table', int.parse(paper),
'Test Order', 'DINE IN',
'Test Cashier', );
'Test Customer',
int.parse(paper), // Print test
'DINE IN', await PrinterService().printWithPrinter(
); testPrinter,
testPrintData,
// Print test context,
await PrinterService().printWithPrinter( );
testPrinter, } catch (e) {
testPrintData, log("Error test printing: $e");
context,
);
} catch (e) {
log("Error test printing: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Error test printing: $e')),
);
}
} else {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(content: Text('Error test printing: $e')),
content: Text(
'Please fill in printer details first')),
); );
} }
}, } else {
label: 'Test Print'), ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Please fill in printer details first')),
);
}
},
label: 'Test Print'
),
SpaceHeight(8), SpaceHeight(8),
// button save // button save
data == null data == null
@@ -160,54 +160,48 @@ class _KitchenPrinterPageState extends State<KitchenPrinterPage> {
SpaceHeight(16), SpaceHeight(16),
// button test print // button test print
Button.outlined( Button.outlined(
onPressed: () async { onPressed: () async {
if (addressController!.text.isNotEmpty && if (addressController!.text.isNotEmpty && printNameController!.text.isNotEmpty) {
printNameController!.text.isNotEmpty) { try {
try { // Create a test print model
// Create a test print model final testPrinter = PrintModel(
final testPrinter = PrintModel( code: 'kitchen',
code: 'kitchen', name: printNameController!.text,
name: printNameController!.text, address: addressController!.text,
address: addressController!.text, paper: paper,
paper: paper, type: selectedPrinter,
type: selectedPrinter, );
);
// Generate test print data
// Generate test print data final testPrintData = await PrintDataoutputs.instance.printKitchen(
final testPrintData = await PrintDataoutputs [], // Empty product list for test
.instance 'Test Table',
.printKitchen( 'Test Order',
[], // Empty product list for test 'Test Cashier',
'Test Table', int.parse(paper),
'Test Order', 'DINE IN',
'Test Cashier', );
'Test Customer',
int.parse(paper), // Print test
'DINE IN', await PrinterService().printWithPrinter(
); testPrinter,
testPrintData,
// Print test context,
await PrinterService().printWithPrinter( );
testPrinter, } catch (e) {
testPrintData, log("Error test printing: $e");
context,
);
} catch (e) {
log("Error test printing: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Error test printing: $e')),
);
}
} else {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(content: Text('Error test printing: $e')),
content: Text(
'Please fill in printer details first')),
); );
} }
}, } else {
label: 'Test Print'), ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Please fill in printer details first')),
);
}
},
label: 'Test Print'
),
SpaceHeight(8), SpaceHeight(8),
// button save // button save
data == null data == null
@@ -932,7 +932,7 @@ class _SplitBillPageState extends State<SplitBillPage> {
Order splitOrder = Order( Order splitOrder = Order(
id: widget.order.id, id: widget.order.id,
orderNumber: widget.order.orderNumber, orderNumber: widget.order.orderNumber,
orderItems: [], // Keep all items for reference orderItems: getOrderItemPending(), // Keep all items for reference
subtotal: splitAmount, subtotal: splitAmount,
totalAmount: splitAmount, totalAmount: splitAmount,
taxAmount: 0, // You might want to calculate proportional values taxAmount: 0, // You might want to calculate proportional values
@@ -204,186 +204,180 @@ class _SuccessOrderPageState extends State<SuccessOrderPage>
child: Column( child: Column(
children: [ children: [
// Success Header with Glassmorphism Effect // Success Header with Glassmorphism Effect
Expanded( Container(
child: SingleChildScrollView( width: double.infinity,
child: Column( padding: const EdgeInsets.all(32.0),
children: [ decoration: BoxDecoration(
Container( gradient: LinearGradient(
width: double.infinity, begin: Alignment.topLeft,
padding: const EdgeInsets.all(32.0), end: Alignment.bottomRight,
decoration: BoxDecoration( colors: [
gradient: LinearGradient( AppColors.primary.withOpacity(0.1),
begin: Alignment.topLeft, AppColors.primary.withOpacity(0.05),
end: Alignment.bottomRight, ],
colors: [ ),
AppColors.primary.withOpacity(0.1), borderRadius: const BorderRadius.vertical(
AppColors.primary.withOpacity(0.05), top: Radius.circular(24),
], ),
), ),
borderRadius: const BorderRadius.vertical( child: Column(
top: Radius.circular(24), children: [
), // Animated Success Icon with Floating Effect
), AnimatedBuilder(
child: Column( animation: _floatingAnimation,
children: [ builder: (context, child) {
// Animated Success Icon with Floating Effect return Transform.translate(
AnimatedBuilder( offset: Offset(0, _floatingAnimation.value),
animation: _floatingAnimation, child: ScaleTransition(
builder: (context, child) { scale: _successIconAnimation,
return Transform.translate( child: Container(
offset: Offset(0, _floatingAnimation.value), padding: const EdgeInsets.all(20.0),
child: ScaleTransition( decoration: BoxDecoration(
scale: _successIconAnimation, gradient: LinearGradient(
child: Container( begin: Alignment.topLeft,
padding: const EdgeInsets.all(20.0), end: Alignment.bottomRight,
decoration: BoxDecoration( colors: [
gradient: LinearGradient( AppColors.primary,
begin: Alignment.topLeft, AppColors.primary.withOpacity(0.8),
end: Alignment.bottomRight, ],
colors: [
AppColors.primary,
AppColors.primary.withOpacity(0.8),
],
),
shape: BoxShape.circle,
boxShadow: [
BoxShadow(
color: AppColors.primary
.withOpacity(0.3),
blurRadius: 20,
offset: const Offset(0, 10),
),
],
),
child: const Icon(
Icons.check_rounded,
size: 48,
color: Colors.white,
),
),
),
);
},
),
const SizedBox(height: 24),
// Success Title with Shimmer Effect
FadeTransition(
opacity: _fadeInAnimation,
child: ShaderMask(
shaderCallback: (bounds) {
return LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: const [
AppColors.primary,
Colors.amber,
AppColors.primary,
],
stops: [
_shimmerAnimation.value - 1,
_shimmerAnimation.value,
_shimmerAnimation.value + 1,
],
).createShader(bounds);
},
child: const Text(
'Pesanan Berhasil!',
style: TextStyle(
fontSize: 26,
fontWeight: FontWeight.bold,
color: Colors.white,
),
), ),
), shape: BoxShape.circle,
), boxShadow: [
BoxShadow(
const SizedBox(height: 12), color: AppColors.primary.withOpacity(0.3),
blurRadius: 20,
FadeTransition( offset: const Offset(0, 10),
opacity: _fadeInAnimation,
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.2),
borderRadius: BorderRadius.circular(20),
),
child: const Text(
'Pesanan telah diterima dan sedang diproses',
style: TextStyle(
fontSize: 14,
color: AppColors.primary,
fontWeight: FontWeight.w500,
),
textAlign: TextAlign.center,
),
),
),
],
),
),
// Order Information Section
Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildSectionTitle('Informasi Pesanan'),
const SizedBox(height: 24),
// Customer Card with Gradient Background
_buildInfoCard(
icon: Icons.person_outline_rounded,
title: 'Nama Pelanggan',
value:
widget.order.metadata?['customer_name'] ?? "-",
gradient: [
Colors.blue.withOpacity(0.1),
Colors.purple.withOpacity(0.1),
],
),
const SizedBox(height: 16),
// Order Details Grid
Column(
children: [
_buildInfoRow(
icon: Icons.receipt_long_outlined,
label: 'No. Pesanan',
value: widget.order.orderNumber ?? "-",
delay: 0.3,
),
const SizedBox(height: 12),
_buildInfoRow(
icon: Icons.wallet_outlined,
label: 'Metode Pembayaran',
value: widget.paymentMethod ?? "-",
delay: 0.3,
),
if (widget.order.tableNumber != "") ...[
const SizedBox(height: 12),
_buildInfoRow(
icon: Icons.table_restaurant_outlined,
label: 'No. Meja',
value: widget.order.tableNumber ?? "-",
delay: 0.4,
), ),
], ],
const SizedBox(height: 12), ),
_buildInfoRow( child: const Icon(
icon: Icons.access_time_rounded, Icons.check_rounded,
label: 'Waktu', size: 48,
value: color: Colors.white,
(widget.order.createdAt ?? DateTime.now()) ),
.toFormattedDate3(), ),
delay: 0.5, ),
), );
], },
),
const SizedBox(height: 24),
// Success Title with Shimmer Effect
FadeTransition(
opacity: _fadeInAnimation,
child: ShaderMask(
shaderCallback: (bounds) {
return LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: const [
AppColors.primary,
Colors.amber,
AppColors.primary,
],
stops: [
_shimmerAnimation.value - 1,
_shimmerAnimation.value,
_shimmerAnimation.value + 1,
],
).createShader(bounds);
},
child: const Text(
'Pesanan Berhasil!',
style: TextStyle(
fontSize: 26,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
),
const SizedBox(height: 12),
FadeTransition(
opacity: _fadeInAnimation,
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.2),
borderRadius: BorderRadius.circular(20),
),
child: const Text(
'Pesanan telah diterima dan sedang diproses',
style: TextStyle(
fontSize: 14,
color: AppColors.primary,
fontWeight: FontWeight.w500,
),
textAlign: TextAlign.center,
),
),
),
],
),
),
// Order Information Section
Expanded(
child: Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildSectionTitle('Informasi Pesanan'),
const SizedBox(height: 24),
// Customer Card with Gradient Background
_buildInfoCard(
icon: Icons.person_outline_rounded,
title: 'Nama Pelanggan',
value: widget.order.metadata?['customer_name'] ?? "-",
gradient: [
Colors.blue.withOpacity(0.1),
Colors.purple.withOpacity(0.1),
],
),
const SizedBox(height: 16),
// Order Details Grid
Expanded(
child: Column(
children: [
_buildInfoRow(
icon: Icons.receipt_long_outlined,
label: 'No. Pesanan',
value: widget.order.orderNumber ?? "-",
delay: 0.3,
),
const SizedBox(height: 12),
_buildInfoRow(
icon: Icons.table_restaurant_outlined,
label: 'No. Meja',
value: widget.order.tableNumber ?? "-",
delay: 0.4,
),
const SizedBox(height: 12),
_buildInfoRow(
icon: Icons.access_time_rounded,
label: 'Waktu',
value: (widget.order.createdAt ?? DateTime.now())
.toFormattedDate3(),
delay: 0.5,
),
const SizedBox(height: 12),
_buildInfoRow(
icon: Icons.check_circle_outline,
label: 'Status Pembayaran',
value: 'Lunas',
delay: 0.6,
valueColor: Colors.green,
showBadge: true,
), ),
], ],
), ),
@@ -1018,7 +1012,6 @@ class _SuccessOrderPageState extends State<SuccessOrderPage>
: widget.order.totalAmount ?? 0, : widget.order.totalAmount ?? 0,
kembalian: widget.nominalBayar - kembalian: widget.nominalBayar -
(widget.order.totalAmount ?? 0), (widget.order.totalAmount ?? 0),
productQuantity: widget.productQuantity,
); );
onPrint( onPrint(
context, context,
@@ -108,146 +108,141 @@ class _SuccessPaymentPageState extends State<SuccessPaymentPage> {
child: Column( child: Column(
children: [ children: [
// Success Header // Success Header
Expanded( Container(
child: SingleChildScrollView( width: double.infinity,
child: Column( padding: const EdgeInsets.all(32.0),
children: [ decoration: BoxDecoration(
Container( gradient: LinearGradient(
width: double.infinity, begin: Alignment.topLeft,
padding: const EdgeInsets.all(32.0), end: Alignment.bottomRight,
decoration: BoxDecoration( colors: [
gradient: LinearGradient( AppColors.primary.withOpacity(0.1),
begin: Alignment.topLeft, AppColors.primary.withOpacity(0.05),
end: Alignment.bottomRight, ],
colors: [ ),
AppColors.primary.withOpacity(0.1), borderRadius: const BorderRadius.vertical(
AppColors.primary.withOpacity(0.05), top: Radius.circular(24),
], ),
), ),
borderRadius: const BorderRadius.vertical( child: Column(
top: Radius.circular(24), children: [
), // Success Icon
), Container(
child: Column( padding: const EdgeInsets.all(20.0),
children: [ decoration: BoxDecoration(
// Success Icon gradient: LinearGradient(
Container( begin: Alignment.topLeft,
padding: const EdgeInsets.all(20.0), end: Alignment.bottomRight,
decoration: BoxDecoration( colors: [
gradient: LinearGradient( AppColors.primary,
begin: Alignment.topLeft, AppColors.primary.withOpacity(0.8),
end: Alignment.bottomRight,
colors: [
AppColors.primary,
AppColors.primary.withOpacity(0.8),
],
),
shape: BoxShape.circle,
boxShadow: [
BoxShadow(
color: AppColors.primary.withOpacity(0.3),
blurRadius: 20,
offset: const Offset(0, 10),
),
],
),
child: const Icon(
Icons.check_rounded,
size: 48,
color: Colors.white,
),
),
const SizedBox(height: 24),
// Success Title
const Text(
'Pesanan Berhasil!',
style: TextStyle(
fontSize: 26,
fontWeight: FontWeight.bold,
color: AppColors.primary,
),
),
const SizedBox(height: 12),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.2),
borderRadius: BorderRadius.circular(20),
),
child: const Text(
'Pesanan telah diterima dan sedang diproses',
style: TextStyle(
fontSize: 14,
color: AppColors.primary,
fontWeight: FontWeight.w500,
),
textAlign: TextAlign.center,
),
),
], ],
), ),
shape: BoxShape.circle,
boxShadow: [
BoxShadow(
color: AppColors.primary.withOpacity(0.3),
blurRadius: 20,
offset: const Offset(0, 10),
),
],
), ),
// Order Information Section child: const Icon(
Padding( Icons.check_rounded,
padding: const EdgeInsets.all(24.0), size: 48,
color: Colors.white,
),
),
const SizedBox(height: 24),
// Success Title
const Text(
'Pesanan Berhasil!',
style: TextStyle(
fontSize: 26,
fontWeight: FontWeight.bold,
color: AppColors.primary,
),
),
const SizedBox(height: 12),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.2),
borderRadius: BorderRadius.circular(20),
),
child: const Text(
'Pesanan telah diterima dan sedang diproses',
style: TextStyle(
fontSize: 14,
color: AppColors.primary,
fontWeight: FontWeight.w500,
),
textAlign: TextAlign.center,
),
),
],
),
),
// Order Information Section
Expanded(
child: Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildSectionTitle('Informasi Pesanan'),
const SizedBox(height: 24),
// Customer Card
_buildInfoCard(
icon: Icons.person_outline_rounded,
title: 'Nama Pelanggan',
value: order.metadata?['customer_name'] ?? "-",
gradient: [
Colors.blue.withOpacity(0.1),
Colors.purple.withOpacity(0.1),
],
),
const SizedBox(height: 16),
// Order Details
Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
_buildSectionTitle('Informasi Pesanan'), _buildInfoRow(
const SizedBox(height: 24), icon: Icons.receipt_long_outlined,
label: 'No. Pesanan',
// Customer Card value: order.orderNumber ?? "-",
_buildInfoCard(
icon: Icons.person_outline_rounded,
title: 'Nama Pelanggan',
value: order.metadata?['customer_name'] ?? "-",
gradient: [
Colors.blue.withOpacity(0.1),
Colors.purple.withOpacity(0.1),
],
), ),
const SizedBox(height: 12),
const SizedBox(height: 16), _buildInfoRow(
icon: Icons.table_restaurant_outlined,
// Order Details label: 'No. Meja',
Expanded( value: order.tableNumber ?? "-",
child: Column( ),
children: [ const SizedBox(height: 12),
_buildInfoRow( _buildInfoRow(
icon: Icons.receipt_long_outlined, icon: Icons.access_time_rounded,
label: 'No. Pesanan', label: 'Waktu',
value: order.orderNumber ?? "-", value: (order.createdAt ?? DateTime.now())
), .toFormattedDate3(),
const SizedBox(height: 12), ),
_buildInfoRow( const SizedBox(height: 12),
icon: Icons.receipt_long_outlined, _buildInfoRow(
label: 'Metode Pembayaran', icon: Icons.check_circle_outline,
value: widget.paymentMethod, label: 'Status Pembayaran',
), value: 'Lunas',
const SizedBox(height: 12), valueColor: Colors.green,
_buildInfoRow( showBadge: true,
icon: Icons.access_time_rounded,
label: 'Waktu',
value: (order.createdAt ?? DateTime.now())
.toFormattedDate3(),
),
const SizedBox(height: 12),
_buildInfoRow(
icon: Icons.check_circle_outline,
label: 'Status Pembayaran',
value: 'Lunas',
valueColor: Colors.green,
showBadge: true,
),
],
),
), ),
], ],
), ),
@@ -803,7 +798,6 @@ class _SuccessPaymentPageState extends State<SuccessPaymentPage> {
: order.totalAmount ?? 0, : order.totalAmount ?? 0,
kembalian: kembalian:
widget.nominalBayar - (order.totalAmount ?? 0), widget.nominalBayar - (order.totalAmount ?? 0),
productQuantity: widget.productQuantity,
); );
}, },
child: const Row( child: const Row(
+2 -14
View File
@@ -1,10 +1,7 @@
import 'dart:developer';
import 'package:enaklo_pos/core/components/flushbar.dart'; import 'package:enaklo_pos/core/components/flushbar.dart';
import 'package:enaklo_pos/core/constants/colors.dart'; import 'package:enaklo_pos/core/constants/colors.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/data/models/response/table_model.dart'; import 'package:enaklo_pos/data/models/response/table_model.dart';
import 'package:enaklo_pos/presentation/home/models/product_quantity.dart';
import 'package:enaklo_pos/presentation/home/pages/dashboard_page.dart'; import 'package:enaklo_pos/presentation/home/pages/dashboard_page.dart';
import 'package:enaklo_pos/presentation/table/blocs/change_position_table/change_position_table_bloc.dart'; import 'package:enaklo_pos/presentation/table/blocs/change_position_table/change_position_table_bloc.dart';
import 'package:enaklo_pos/presentation/table/blocs/create_table/create_table_bloc.dart'; import 'package:enaklo_pos/presentation/table/blocs/create_table/create_table_bloc.dart';
@@ -35,8 +32,7 @@ TableStatus parseStatus(String? status) {
} }
class TablePage extends StatefulWidget { class TablePage extends StatefulWidget {
final List<ProductQuantity>? items; const TablePage({super.key});
const TablePage({super.key, this.items});
@override @override
State<TablePage> createState() => _TablePageState(); State<TablePage> createState() => _TablePageState();
@@ -65,7 +61,6 @@ class _TablePageState extends State<TablePage> {
@override @override
void initState() { void initState() {
log("ITEM COUNT: ${widget.items?.length}");
context.read<GetTableBloc>().add(const GetTableEvent.getTables()); context.read<GetTableBloc>().add(const GetTableEvent.getTables());
super.initState(); super.initState();
} }
@@ -79,12 +74,6 @@ class _TablePageState extends State<TablePage> {
appBar: AppBar( appBar: AppBar(
title: const Text("Layout Meja"), title: const Text("Layout Meja"),
actions: [ actions: [
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
context.read<GetTableBloc>().add(const GetTableEvent.getTables());
},
),
BlocListener<CreateTableBloc, CreateTableState>( BlocListener<CreateTableBloc, CreateTableState>(
listener: (context, state) { listener: (context, state) {
state.maybeWhen( state.maybeWhen(
@@ -402,9 +391,8 @@ class _TablePageState extends State<TablePage> {
), ),
onPressed: () { onPressed: () {
if (selectedTable?.status == 'available') { if (selectedTable?.status == 'available') {
context.pushReplacement(DashboardPage( context.push(DashboardPage(
table: selectedTable!, table: selectedTable!,
items: widget.items,
)); ));
} else {} } else {}
}, },
@@ -1,6 +1,5 @@
import 'dart:developer'; import 'dart:developer';
import 'package:enaklo_pos/presentation/home/models/product_quantity.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:enaklo_pos/core/components/components.dart'; import 'package:enaklo_pos/core/components/components.dart';
@@ -16,15 +15,13 @@ import 'package:enaklo_pos/presentation/home/bloc/status_table/status_table_bloc
import 'package:enaklo_pos/presentation/home/pages/home_page.dart'; import 'package:enaklo_pos/presentation/home/pages/home_page.dart';
import 'package:enaklo_pos/presentation/table/blocs/get_table/get_table_bloc.dart'; import 'package:enaklo_pos/presentation/table/blocs/get_table/get_table_bloc.dart';
import 'package:enaklo_pos/presentation/table/models/draft_order_model.dart'; import 'package:enaklo_pos/presentation/table/models/draft_order_model.dart';
import 'package:enaklo_pos/presentation/table/pages/payment_table_page.dart.old'; import 'package:enaklo_pos/presentation/table/pages/payment_table_page.dart';
class CardTableWidget extends StatefulWidget { class CardTableWidget extends StatefulWidget {
final TableModel table; final TableModel table;
final List<ProductQuantity> items;
const CardTableWidget({ const CardTableWidget({
super.key, super.key,
required this.table, required this.table,
required this.items,
}); });
@override @override
@@ -92,7 +89,6 @@ class _CardTableWidgetState extends State<CardTableWidget> {
context.push(HomePage( context.push(HomePage(
isTable: true, isTable: true,
table: widget.table, table: widget.table,
items: widget.items,
)); ));
} else { } else {
context.read<CheckoutBloc>().add( context.read<CheckoutBloc>().add(
@@ -3,7 +3,6 @@ import 'package:enaklo_pos/core/components/spaces.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/core/extensions/date_time_ext.dart'; import 'package:enaklo_pos/core/extensions/date_time_ext.dart';
import 'package:enaklo_pos/core/extensions/int_ext.dart'; import 'package:enaklo_pos/core/extensions/int_ext.dart';
import 'package:enaklo_pos/core/function/app_function.dart';
import 'package:enaklo_pos/presentation/home/pages/dashboard_page.dart'; import 'package:enaklo_pos/presentation/home/pages/dashboard_page.dart';
import 'package:enaklo_pos/presentation/void/painter/pattern_painter.dart'; import 'package:enaklo_pos/presentation/void/painter/pattern_painter.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -633,10 +632,5 @@ class _SuccessVoidPageState extends State<SuccessVoidPage>
); );
} }
void _printVoidReceipt() { void _printVoidReceipt() {}
onPrinVoidRecipt(context,
order: widget.voidedOrder,
productItemVoid: widget.voidedItems ?? [],
totalVoid: widget.voidAmount);
}
} }
+30 -59
View File
@@ -5,23 +5,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: _fe_analyzer_shared name: _fe_analyzer_shared
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "76.0.0" version: "67.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.3"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
name: analyzer name: analyzer
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.11.0" version: "6.4.1"
another_flushbar: another_flushbar:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -106,10 +101,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: build name: build
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.2" version: "2.4.1"
build_config: build_config:
dependency: transitive dependency: transitive
description: description:
@@ -130,26 +125,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: build_resolvers name: build_resolvers
sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.3" version: "2.4.2"
build_runner: build_runner:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: build_runner name: build_runner
sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.14" version: "2.4.13"
build_runner_core: build_runner_core:
dependency: transitive dependency: transitive
description: description:
name: build_runner_core name: build_runner_core
sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.0.0" version: "7.3.2"
built_collection: built_collection:
dependency: transitive dependency: transitive
description: description:
@@ -314,10 +309,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: dart_style name: dart_style
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.7" version: "2.3.6"
dartx: dartx:
dependency: transitive dependency: transitive
description: description:
@@ -585,10 +580,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: freezed name: freezed
sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e" sha256: a434911f643466d78462625df76fd9eb13e57348ff43fe1f77bbe909522c67a1
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.7" version: "2.5.2"
freezed_annotation: freezed_annotation:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -809,26 +804,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker name: leak_tracker
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.0.9" version: "11.0.2"
leak_tracker_flutter_testing: leak_tracker_flutter_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_flutter_testing name: leak_tracker_flutter_testing
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.9" version: "3.0.10"
leak_tracker_testing: leak_tracker_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_testing name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.1" version: "3.0.2"
lints: lints:
dependency: transitive dependency: transitive
description: description:
@@ -845,14 +840,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
macros:
dependency: transitive
description:
name: macros
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
url: "https://pub.dev"
source: hosted
version: "0.1.3-main.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@@ -873,10 +860,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.16.0" version: "1.17.0"
mime: mime:
dependency: transitive dependency: transitive
description: description:
@@ -1386,22 +1373,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.4.1" version: "1.4.1"
syncfusion_flutter_core:
dependency: transitive
description:
name: syncfusion_flutter_core
sha256: ce02ce65f51db8e29edc9d2225872d927e001bd2b13c2490d176563bbb046fc7
url: "https://pub.dev"
source: hosted
version: "30.2.5"
syncfusion_flutter_datepicker:
dependency: "direct main"
description:
name: syncfusion_flutter_datepicker
sha256: e8df9f4777df15db11929f20cbe98e4249fe08208e7107bcb4ad889aa1ba2bbf
url: "https://pub.dev"
source: hosted
version: "30.2.5"
synchronized: synchronized:
dependency: transitive dependency: transitive
description: description:
@@ -1422,10 +1393,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.4" version: "0.7.7"
time: time:
dependency: transitive dependency: transitive
description: description:
@@ -1486,10 +1457,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.2.0"
vm_service: vm_service:
dependency: transitive dependency: transitive
description: description:
@@ -1587,5 +1558,5 @@ packages:
source: hosted source: hosted
version: "3.1.3" version: "3.1.3"
sdks: sdks:
dart: ">=3.7.0 <4.0.0" dart: ">=3.8.0-0 <4.0.0"
flutter: ">=3.29.0" flutter: ">=3.27.4"
-1
View File
@@ -66,7 +66,6 @@ dependencies:
fl_chart: ^1.0.0 fl_chart: ^1.0.0
barcode: ^2.2.9 barcode: ^2.2.9
barcode_image: ^2.0.3 barcode_image: ^2.0.3
syncfusion_flutter_datepicker: ^30.2.5
# imin_printer: ^0.6.10 # imin_printer: ^0.6.10
dev_dependencies: dev_dependencies: