This commit is contained in:
2026-03-11 10:46:37 +05:30
parent b9574eb96a
commit 41a222ea11
2 changed files with 19 additions and 20 deletions

View File

@@ -1,5 +1,4 @@
// ignore_for_file: always_specify_types, depend_on_referenced_packages, dead_code, dead_null_aware_expression, unused_local_variable, unused_import, sort_constructors_first, prefer_final_fields, prefer_const_constructors, deprecated_member_use, implicit_call_tearoffs import 'package:firebase_data_connect/firebase_data_connect.dart';
import 'package:firebase_data_connect/src/core/ref.dart';
import 'package:krow_data_connect/krow_data_connect.dart' as dc; import 'package:krow_data_connect/krow_data_connect.dart' as dc;
import 'package:krow_domain/krow_domain.dart'; import 'package:krow_domain/krow_domain.dart';
import '../../domain/repositories/billing_connector_repository.dart'; import '../../domain/repositories/billing_connector_repository.dart';
@@ -131,7 +130,9 @@ class BillingConnectorRepositoryImpl implements BillingConnectorRepository {
final List<dc.ListShiftRolesByBusinessAndDatesSummaryShiftRoles> final List<dc.ListShiftRolesByBusinessAndDatesSummaryShiftRoles>
shiftRoles = result.data.shiftRoles; shiftRoles = result.data.shiftRoles;
if (shiftRoles.isEmpty) return <InvoiceItem>[]; if (shiftRoles.isEmpty) {
return <InvoiceItem>[];
}
final Map<String, _RoleSummary> summary = <String, _RoleSummary>{}; final Map<String, _RoleSummary> summary = <String, _RoleSummary>{};
for (final dc.ListShiftRolesByBusinessAndDatesSummaryShiftRoles role for (final dc.ListShiftRolesByBusinessAndDatesSummaryShiftRoles role
@@ -272,16 +273,17 @@ class BillingConnectorRepositoryImpl implements BillingConnectorRepository {
int breakMin = 0; int breakMin = 0;
final String? breakType = app.shiftRole?.breakType?.toString(); final String? breakType = app.shiftRole?.breakType?.toString();
if (breakType != null) { if (breakType != null) {
if (breakType.contains('10')) if (breakType.contains('10')) {
breakMin = 10; breakMin = 10;
else if (breakType.contains('15')) } else if (breakType.contains('15')) {
breakMin = 15; breakMin = 15;
else if (breakType.contains('30')) } else if (breakType.contains('30')) {
breakMin = 30; breakMin = 30;
else if (breakType.contains('45')) } else if (breakType.contains('45')) {
breakMin = 45; breakMin = 45;
else if (breakType.contains('60')) } else if (breakType.contains('60')) {
breakMin = 60; breakMin = 60;
}
} }
return InvoiceWorker( return InvoiceWorker(
@@ -324,9 +326,11 @@ class BillingConnectorRepositoryImpl implements BillingConnectorRepository {
} }
double _calculateTotalHours(List<dynamic> roles) { double _calculateTotalHours(List<dynamic> roles) {
return roles.fold<double>(0.0, (sum, role) { return roles.fold<double>(0.0, (double sum, dynamic role) {
final hours = role['hours'] ?? role['workHours'] ?? role['totalHours']; final dynamic hours = role['hours'] ?? role['workHours'] ?? role['totalHours'];
if (hours is num) return sum + hours.toDouble(); if (hours is num) {
return sum + hours.toDouble();
}
return sum; return sum;
}); });
} }

View File

@@ -1,4 +1,3 @@
// ignore_for_file: always_specify_types, depend_on_referenced_packages, dead_code, dead_null_aware_expression, unused_local_variable, unused_import, sort_constructors_first, prefer_final_fields, prefer_const_constructors, deprecated_member_use, implicit_call_tearoffs, implementation_imports
import 'package:design_system/design_system.dart'; import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -30,27 +29,24 @@ class OtpInputField extends StatefulWidget {
} }
class _OtpInputFieldState extends State<OtpInputField> { class _OtpInputFieldState extends State<OtpInputField> {
final List<TextEditingController> _controllers = List.generate( final List<TextEditingController> _controllers = List<TextEditingController>.generate(
6, 6,
(_) => TextEditingController(), (int _) => TextEditingController(),
); );
final List<FocusNode> _focusNodes = List.generate(6, (_) => FocusNode()); final List<FocusNode> _focusNodes = List<FocusNode>.generate(6, (int _) => FocusNode());
/// Hidden field for E2E: Maestro inputText sends full OTP in one call; /// Hidden field for E2E: Maestro inputText sends full OTP in one call;
/// the 6 visible boxes have maxLength:1 and would truncate. /// the 6 visible boxes have maxLength:1 and would truncate.
late final TextEditingController _hiddenController;
late final FocusNode _hiddenFocusNode; late final FocusNode _hiddenFocusNode;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_hiddenController = TextEditingController();
_hiddenFocusNode = FocusNode(); _hiddenFocusNode = FocusNode();
} }
@override @override
void dispose() { void dispose() {
_hiddenController.dispose();
_hiddenFocusNode.dispose(); _hiddenFocusNode.dispose();
for (final TextEditingController controller in _controllers) { for (final TextEditingController controller in _controllers) {
controller.dispose(); controller.dispose();
@@ -111,7 +107,7 @@ class _OtpInputFieldState extends State<OtpInputField> {
children: <Widget>[ children: <Widget>[
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: List.generate(6, (int index) { children: List<Widget>.generate(6, (int index) {
final TextField field = TextField( final TextField field = TextField(
controller: _controllers[index], controller: _controllers[index],
focusNode: _focusNodes[index], focusNode: _focusNodes[index],
@@ -157,7 +153,6 @@ class _OtpInputFieldState extends State<OtpInputField> {
child: Opacity( child: Opacity(
opacity: 0.01, opacity: 0.01,
child: TextField( child: TextField(
controller: _hiddenController,
focusNode: _hiddenFocusNode, focusNode: _hiddenFocusNode,
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[ inputFormatters: <TextInputFormatter>[