API v4 계약 반영하고 보고서·입출고 화면 실연동 강화

This commit is contained in:
JiWoong Sul
2025-10-16 14:57:07 +09:00
parent 7e0f7b1c55
commit d5c99627db
34 changed files with 1767 additions and 327 deletions

View File

@@ -1289,8 +1289,12 @@ class _InboundPageState extends State<InboundPage> {
);
final remarkController = TextEditingController(text: initial?.remark ?? '');
final transactionNumberController = TextEditingController(
text: initial?.transactionNumber ?? '저장 시 자동 생성',
text: initial?.transactionNumber ?? '',
);
final approvalNumberController = TextEditingController(
text: initial?.raw?.approval?.approvalNo ?? '',
);
final approvalNoteController = TextEditingController();
final transactionTypeValue =
initial?.transactionType ??
_transactionTypeLookup?.name ??
@@ -1311,6 +1315,8 @@ class _InboundPageState extends State<InboundPage> {
};
String? writerError;
String? transactionNumberError;
String? approvalNumberError;
String? warehouseError;
String? statusError;
String? headerNotice;
@@ -1339,12 +1345,18 @@ class _InboundPageState extends State<InboundPage> {
writerController: writerController,
writerSelection: writerSelection,
requireWriterSelection: initial == null,
transactionNumberController: transactionNumberController,
transactionNumberRequired: initial == null,
approvalNumberController: approvalNumberController,
approvalNumberRequired: initial == null,
warehouseSelection: warehouseSelection,
statusValue: statusValue.value,
drafts: drafts,
lineErrors: lineErrors,
);
writerError = validationResult.writerError;
transactionNumberError = validationResult.transactionNumberError;
approvalNumberError = validationResult.approvalNumberError;
warehouseError = validationResult.warehouseError;
statusError = validationResult.statusError;
headerNotice = validationResult.headerNotice;
@@ -1388,6 +1400,9 @@ class _InboundPageState extends State<InboundPage> {
final remarkText = remarkController.text.trim();
final remarkValue = remarkText.isEmpty ? null : remarkText;
final transactionNoValue = transactionNumberController.text.trim();
final approvalNoValue = approvalNumberController.text.trim();
final approvalNoteValue = approvalNoteController.text.trim();
final transactionId = initial?.id;
final initialRecord = initial;
@@ -1475,6 +1490,7 @@ class _InboundPageState extends State<InboundPage> {
.toList(growable: false);
final created = await controller.createTransaction(
StockTransactionCreateInput(
transactionNo: transactionNoValue,
transactionTypeId: transactionTypeLookup.id,
transactionStatusId: statusItem.id,
warehouseId: warehouseId,
@@ -1482,6 +1498,11 @@ class _InboundPageState extends State<InboundPage> {
createdById: createdById,
note: remarkValue,
lines: createLines,
approval: StockTransactionApprovalInput(
approvalNo: approvalNoValue,
requestedById: createdById,
note: approvalNoteValue.isEmpty ? null : approvalNoteValue,
),
),
);
result = created;
@@ -1635,10 +1656,41 @@ class _InboundPageState extends State<InboundPage> {
width: 240,
child: SuperportFormField(
label: '트랜잭션번호',
required: true,
errorText: transactionNumberError,
child: ShadInput(
controller: transactionNumberController,
readOnly: true,
enabled: false,
readOnly: initial != null,
enabled: initial == null,
placeholder: const Text('예: IN-2024-0001'),
onChanged: (_) {
if (transactionNumberError != null) {
setState(() {
transactionNumberError = null;
});
}
},
),
),
),
SizedBox(
width: 240,
child: SuperportFormField(
label: '결재번호',
required: true,
errorText: approvalNumberError,
child: ShadInput(
controller: approvalNumberController,
readOnly: initial != null,
enabled: initial == null,
placeholder: const Text('예: APP-2024-0001'),
onChanged: (_) {
if (approvalNumberError != null) {
setState(() {
approvalNumberError = null;
});
}
},
),
),
),
@@ -1680,6 +1732,16 @@ class _InboundPageState extends State<InboundPage> {
),
),
),
SizedBox(
width: 500,
child: SuperportFormField(
label: '결재 메모',
child: ShadInput(
controller: approvalNoteController,
maxLines: 2,
),
),
),
SizedBox(
width: 500,
child: SuperportFormField(
@@ -1802,6 +1864,8 @@ class _InboundPageState extends State<InboundPage> {
writerController.dispose();
remarkController.dispose();
transactionNumberController.dispose();
approvalNumberController.dispose();
approvalNoteController.dispose();
transactionTypeController.dispose();
processedAt.dispose();
@@ -2346,6 +2410,10 @@ _InboundFormValidation _validateInboundForm({
required TextEditingController writerController,
required InventoryEmployeeSuggestion? writerSelection,
required bool requireWriterSelection,
required TextEditingController transactionNumberController,
required bool transactionNumberRequired,
required TextEditingController approvalNumberController,
required bool approvalNumberRequired,
required InventoryWarehouseOption? warehouseSelection,
required String statusValue,
required List<_LineItemDraft> drafts,
@@ -2353,6 +2421,8 @@ _InboundFormValidation _validateInboundForm({
}) {
var isValid = true;
String? writerError;
String? transactionNumberError;
String? approvalNumberError;
String? warehouseError;
String? statusError;
String? headerNotice;
@@ -2368,6 +2438,18 @@ _InboundFormValidation _validateInboundForm({
isValid = false;
}
final transactionNumber = transactionNumberController.text.trim();
if (transactionNumberRequired && transactionNumber.isEmpty) {
transactionNumberError = '거래번호를 입력하세요.';
isValid = false;
}
final approvalNumber = approvalNumberController.text.trim();
if (approvalNumberRequired && approvalNumber.isEmpty) {
approvalNumberError = '결재번호를 입력하세요.';
isValid = false;
}
if (warehouseSelection == null) {
warehouseError = '창고를 선택하세요.';
isValid = false;
@@ -2426,6 +2508,8 @@ _InboundFormValidation _validateInboundForm({
return _InboundFormValidation(
isValid: isValid,
writerError: writerError,
transactionNumberError: transactionNumberError,
approvalNumberError: approvalNumberError,
warehouseError: warehouseError,
statusError: statusError,
headerNotice: headerNotice,
@@ -2441,6 +2525,8 @@ class _InboundFormValidation {
const _InboundFormValidation({
required this.isValid,
this.writerError,
this.transactionNumberError,
this.approvalNumberError,
this.warehouseError,
this.statusError,
this.headerNotice,
@@ -2448,6 +2534,8 @@ class _InboundFormValidation {
final bool isValid;
final String? writerError;
final String? transactionNumberError;
final String? approvalNumberError;
final String? warehouseError;
final String? statusError;
final String? headerNotice;