Compare commits

...

10 Commits

Author SHA1 Message Date
backuppc
116af44965 .. 2025-12-19 16:26:57 +09:00
ChiKyun Kim
b1c3bbac42 toshortstring -> tostring 2025-12-19 08:23:13 +09:00
backuppc
ab46ccb924 휴가신청화면에서 메세지가 날짜에 맞게 자동 변경되게함.
시작일자가 종료일자보다 클때에는 종료일자는 시작일자에 맞추게 함
2025-12-18 15:22:54 +09:00
backuppc
890e6edab4 nr 구매 제한 기능 추가
- 트리거를 이용하여 기존 프로그램 사용자도 오류가 발생하도록 함
2025-12-12 11:06:13 +09:00
backuppc
77f1ddab80 .. 2025-12-05 17:33:12 +09:00
backuppc
8e8d1f91b4 feat: 메뉴 재배치 및 UX 개선
- 메뉴: 즐겨찾기를 할일 좌측으로 이동
- 게시판: 답글 있는 게시글 삭제 방지 (댓글은 허용)
- 즐겨찾기: ESC 키로 다이얼로그 닫기 지원
- 프로젝트: 기본 필터를 검토/진행/완료로 변경 (보류 해제)
2025-12-03 10:32:10 +09:00
backuppc
c1c615fe1b feat: 게시판 댓글/답글 시스템 및 대시보드 개선
주요 변경사항:
- 게시판 계층형 댓글/답글 시스템 구현
  - DB: root_idx, depth, thread_path, is_comment, reply_count 컬럼 추가
  - 트리거: 댓글 개수 자동 업데이트
  - 답글(is_comment=false)은 목록에 표시, 댓글(is_comment=true)은 뷰어에만 표시
  - ESC 키로 모달 닫기 기능

- 업무일지 개선
  - 프로젝트 선택 시 최종 설정 자동 불러오기
  - 복사 시 jobgrp, tag 포함
  - 완료(보고) 상태 프로젝트도 검색 가능하도록 수정

- 대시보드 개선
  - 할일 목록 페이징 추가 (6개씩)
  - 할일에 요청자 정보 표시 (제목 좌측에 괄호로)
2025-12-03 10:10:29 +09:00
backuppc
3d53a5c42f Simplify patch edit layout: hide header, compact category+title in one row 2025-12-03 08:24:56 +09:00
backuppc
40abcde0a9 Change patch category labels to uppercase: PATCH, UPDATE 2025-12-03 08:23:00 +09:00
backuppc
bb66af89ae Change jobreport date buttons from 4x1 to 2x2 grid layout 2025-12-03 08:20:57 +09:00
223 changed files with 17332 additions and 56987 deletions

View File

@@ -0,0 +1,327 @@
-- =============================================
-- EETGW_Board 테이블 구조 변경: 댓글/답글 시스템 추가
-- 작성일: 2025-12-03
-- 설명: 계층형 댓글/답글을 효율적으로 관리하기 위한 컬럼 추가
-- =============================================
USE [EETGW]
GO
PRINT '=== Starting EETGW_Board structure update ===';
PRINT 'Timestamp: ' + CONVERT(VARCHAR(20), GETDATE(), 120);
GO
-- 1. 기존 테이블 백업
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'EETGW_Board_Backup_20251203')
BEGIN
SELECT * INTO EETGW_Board_Backup_20251203 FROM EETGW_Board;
PRINT '✓ Backup created: EETGW_Board_Backup_20251203';
END
ELSE
BEGIN
PRINT '⚠ Backup already exists: EETGW_Board_Backup_20251203';
END
GO
-- 2. 새로운 컬럼 추가
PRINT '';
PRINT '--- Adding new columns ---';
-- root_idx: 최상위 원글의 idx (답글/댓글이 어느 글에 속하는지)
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'root_idx')
BEGIN
ALTER TABLE EETGW_Board ADD root_idx INT NULL;
PRINT '✓ Added column: root_idx (최상위 원글 idx)';
END
ELSE
BEGIN
PRINT '⊙ Column already exists: root_idx';
END
GO
-- depth: 댓글 깊이 (0=원글, 1=1차댓글, 2=2차댓글...)
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'depth')
BEGIN
ALTER TABLE EETGW_Board ADD depth INT NOT NULL DEFAULT 0;
PRINT '✓ Added column: depth (댓글 깊이)';
END
ELSE
BEGIN
PRINT '⊙ Column already exists: depth';
END
GO
-- sort_order: 같은 레벨에서의 정렬 순서
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'sort_order')
BEGIN
ALTER TABLE EETGW_Board ADD sort_order INT NOT NULL DEFAULT 0;
PRINT '✓ Added column: sort_order (정렬 순서)';
END
ELSE
BEGIN
PRINT '⊙ Column already exists: sort_order';
END
GO
-- thread_path: 계층 경로 (예: "1/5/12" - 빠른 정렬과 조회용)
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'thread_path')
BEGIN
ALTER TABLE EETGW_Board ADD thread_path VARCHAR(1000) NULL;
PRINT '✓ Added column: thread_path (계층 경로)';
END
ELSE
BEGIN
PRINT '⊙ Column already exists: thread_path';
END
GO
-- is_comment: 댓글 여부 (true=댓글형식, false=답글형식)
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'is_comment')
BEGIN
ALTER TABLE EETGW_Board ADD is_comment BIT NOT NULL DEFAULT 0;
PRINT '✓ Added column: is_comment (댓글/답글 구분)';
END
ELSE
BEGIN
PRINT '⊙ Column already exists: is_comment';
END
GO
-- reply_count: 하위 댓글/답글 개수 (캐시용)
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('EETGW_Board') AND name = 'reply_count')
BEGIN
ALTER TABLE EETGW_Board ADD reply_count INT NOT NULL DEFAULT 0;
PRINT '✓ Added column: reply_count (댓글 개수 캐시)';
END
ELSE
BEGIN
PRINT '⊙ Column already exists: reply_count';
END
GO
-- 3. 기존 데이터 마이그레이션
PRINT '';
PRINT '--- Migrating existing data ---';
-- 원글(pidx가 0이거나 NULL인 경우)
UPDATE EETGW_Board
SET
root_idx = idx,
depth = 0,
thread_path = CAST(idx AS VARCHAR(20)),
sort_order = 0,
is_comment = 0
WHERE ISNULL(pidx, 0) = 0 AND (root_idx IS NULL OR thread_path IS NULL);
DECLARE @originalCount INT = @@ROWCOUNT;
PRINT '✓ Updated ' + CAST(@originalCount AS VARCHAR(10)) + ' original posts (depth=0)';
-- 답글(pidx가 있는 경우) - 1depth만 처리
UPDATE b
SET
root_idx = ISNULL(p.root_idx, b.pidx),
depth = CASE WHEN p.depth IS NULL THEN 1 ELSE p.depth + 1 END,
thread_path = ISNULL(p.thread_path, CAST(b.pidx AS VARCHAR(20))) + '/' + CAST(b.idx AS VARCHAR(20)),
sort_order = 0,
is_comment = 0
FROM EETGW_Board b
LEFT JOIN EETGW_Board p ON b.pidx = p.idx
WHERE ISNULL(b.pidx, 0) > 0 AND (b.root_idx IS NULL OR b.thread_path IS NULL);
DECLARE @replyCount INT = @@ROWCOUNT;
PRINT '✓ Updated ' + CAST(@replyCount AS VARCHAR(10)) + ' reply posts';
GO
-- 4. 인덱스 추가 (성능 최적화)
PRINT '';
PRINT '--- Creating indexes ---';
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_EETGW_Board_root_idx_thread_path')
BEGIN
CREATE INDEX IX_EETGW_Board_root_idx_thread_path
ON EETGW_Board(root_idx, thread_path);
PRINT '✓ Created index: IX_EETGW_Board_root_idx_thread_path';
END
ELSE
BEGIN
PRINT '⊙ Index already exists: IX_EETGW_Board_root_idx_thread_path';
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_EETGW_Board_pidx')
BEGIN
CREATE INDEX IX_EETGW_Board_pidx
ON EETGW_Board(pidx);
PRINT '✓ Created index: IX_EETGW_Board_pidx';
END
ELSE
BEGIN
PRINT '⊙ Index already exists: IX_EETGW_Board_pidx';
END
GO
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_EETGW_Board_bidx_wdate')
BEGIN
CREATE INDEX IX_EETGW_Board_bidx_wdate
ON EETGW_Board(bidx, wdate DESC);
PRINT '✓ Created index: IX_EETGW_Board_bidx_wdate';
END
ELSE
BEGIN
PRINT '⊙ Index already exists: IX_EETGW_Board_bidx_wdate';
END
GO
-- 5. reply_count 업데이트 (기존 데이터 기준)
PRINT '';
PRINT '--- Updating reply counts ---';
UPDATE p
SET reply_count = (
SELECT COUNT(*)
FROM EETGW_Board c
WHERE c.root_idx = p.idx AND c.depth > 0
)
FROM EETGW_Board p
WHERE p.depth = 0;
DECLARE @updatedRootPosts INT = @@ROWCOUNT;
PRINT '✓ Updated reply_count for ' + CAST(@updatedRootPosts AS VARCHAR(10)) + ' root posts';
GO
-- 6. 트리거 생성 (reply_count 자동 업데이트)
PRINT '';
PRINT '--- Creating triggers ---';
IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'TR_EETGW_Board_AfterInsert')
BEGIN
DROP TRIGGER TR_EETGW_Board_AfterInsert;
PRINT '⊙ Dropped existing trigger: TR_EETGW_Board_AfterInsert';
END
GO
CREATE TRIGGER TR_EETGW_Board_AfterInsert
ON EETGW_Board
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
-- 댓글/답글이 추가된 경우 root_idx의 reply_count 증가
UPDATE b
SET b.reply_count = b.reply_count + 1
FROM EETGW_Board b
INNER JOIN inserted i ON b.idx = i.root_idx
WHERE i.root_idx IS NOT NULL AND i.depth > 0;
END
GO
PRINT '✓ Created trigger: TR_EETGW_Board_AfterInsert';
GO
IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'TR_EETGW_Board_AfterDelete')
BEGIN
DROP TRIGGER TR_EETGW_Board_AfterDelete;
PRINT '⊙ Dropped existing trigger: TR_EETGW_Board_AfterDelete';
END
GO
CREATE TRIGGER TR_EETGW_Board_AfterDelete
ON EETGW_Board
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
-- 댓글/답글이 삭제된 경우 root_idx의 reply_count 감소
UPDATE b
SET b.reply_count = b.reply_count - 1
FROM EETGW_Board b
INNER JOIN deleted d ON b.idx = d.root_idx
WHERE d.root_idx IS NOT NULL AND d.depth > 0 AND b.reply_count > 0;
END
GO
PRINT '✓ Created trigger: TR_EETGW_Board_AfterDelete';
GO
-- 7. 조회용 뷰 생성 (옵션)
PRINT '';
PRINT '--- Creating views ---';
IF EXISTS (SELECT * FROM sys.views WHERE name = 'vEETGW_Board_WithReplies')
BEGIN
DROP VIEW vEETGW_Board_WithReplies;
PRINT '⊙ Dropped existing view: vEETGW_Board_WithReplies';
END
GO
CREATE VIEW vEETGW_Board_WithReplies
AS
SELECT
b.idx,
b.bidx,
b.header,
b.cate,
b.title,
b.contents,
b.[file],
b.guid,
b.url,
b.wuid,
b.wdate,
b.project,
b.pidx,
b.gcode,
b.[close],
b.remark,
b.root_idx,
b.depth,
b.sort_order,
b.thread_path,
b.is_comment,
b.reply_count,
dbo.getUserName(b.wuid) AS wuid_name,
CASE WHEN b.depth = 0 THEN b.idx ELSE b.root_idx END AS display_root_idx
FROM EETGW_Board b;
GO
PRINT '✓ Created view: vEETGW_Board_WithReplies';
GO
-- 8. 검증 쿼리
PRINT '';
PRINT '--- Verification ---';
DECLARE @totalPosts INT = (SELECT COUNT(*) FROM EETGW_Board);
DECLARE @rootPosts INT = (SELECT COUNT(*) FROM EETGW_Board WHERE depth = 0);
DECLARE @replyPosts INT = (SELECT COUNT(*) FROM EETGW_Board WHERE depth > 0);
PRINT 'Total posts: ' + CAST(@totalPosts AS VARCHAR(10));
PRINT 'Root posts (depth=0): ' + CAST(@rootPosts AS VARCHAR(10));
PRINT 'Reply posts (depth>0): ' + CAST(@replyPosts AS VARCHAR(10));
GO
PRINT '';
PRINT '=== EETGW_Board structure update completed successfully ===';
PRINT '';
PRINT '📋 New columns added:';
PRINT ' • root_idx: 최상위 원글 idx';
PRINT ' • depth: 댓글 깊이 (0=원글, 1=1차댓글, 2=2차댓글...)';
PRINT ' • sort_order: 같은 레벨에서 정렬 순서';
PRINT ' • thread_path: 계층 경로 (빠른 정렬용)';
PRINT ' • is_comment: 댓글 타입 (0=답글, 1=댓글)';
PRINT ' • reply_count: 하위 댓글 개수';
PRINT '';
PRINT '📝 Usage examples:';
PRINT ' -- 원글 목록 (댓글 개수 포함)';
PRINT ' SELECT * FROM EETGW_Board WHERE bidx = 5 AND depth = 0 ORDER BY wdate DESC;';
PRINT '';
PRINT ' -- 특정 글의 전체 댓글 (계층 구조 유지)';
PRINT ' SELECT * FROM EETGW_Board WHERE root_idx = 123 ORDER BY thread_path, wdate;';
PRINT '';
PRINT ' -- 1depth 댓글만 조회';
PRINT ' SELECT * FROM EETGW_Board WHERE root_idx = 123 AND depth = 1 ORDER BY wdate;';
PRINT '';
PRINT '✅ Migration completed at: ' + CONVERT(VARCHAR(20), GETDATE(), 120);
GO

View File

@@ -85,8 +85,8 @@ namespace Project.Dialog
{
DateTime dt = DateTime.Now;
//if(tbID.Text != "dev" && (dt.ToShortDateString() == "2025-04-05" ||
// dt.ToShortDateString() == "2025-04-06"))
//if(tbID.Text != "dev" && (dt.ToString("yyyy-MM-dd") == "2025-04-05" ||
// dt.ToString("yyyy-MM-dd") == "2025-04-06"))
//{
// Util.MsgE("4월 5일~6일은 데이터베이스 마이그레이션 기간이므로 프로그램 사용이 중단 됩니다\n문의 010-9155-9051 (EEDP:김치균)");
// return;

View File

@@ -173,9 +173,21 @@
<Reference Include="Microsoft.Web.WebView2.Wpf, Version=1.0.2210.55, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.2210.55\lib\net45\Microsoft.Web.WebView2.Wpf.dll</HintPath>
</Reference>
<Reference Include="NetOffice, Version=1.8.1.0, Culture=neutral, PublicKeyToken=297f57b43ae7c1de, processorArchitecture=MSIL">
<HintPath>..\packages\NetOfficeFw.Core.1.8.1\lib\net40\NetOffice.dll</HintPath>
<EmbedInteropTypes>False</EmbedInteropTypes>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="OfficeApi, Version=1.8.1.0, Culture=neutral, PublicKeyToken=a39beb0835c43c8e, processorArchitecture=MSIL">
<HintPath>..\packages\NetOfficeFw.Core.1.8.1\lib\net40\OfficeApi.dll</HintPath>
<EmbedInteropTypes>False</EmbedInteropTypes>
</Reference>
<Reference Include="OutlookApi, Version=1.8.1.0, Culture=neutral, PublicKeyToken=b118031aaa1097f3, processorArchitecture=MSIL">
<HintPath>..\packages\NetOfficeFw.Outlook.1.8.1\lib\net40\OutlookApi.dll</HintPath>
<EmbedInteropTypes>False</EmbedInteropTypes>
</Reference>
<Reference Include="System">
<HintPath>..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll</HintPath>
</Reference>
@@ -214,6 +226,10 @@
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="VBIDEApi, Version=1.8.1.0, Culture=neutral, PublicKeyToken=931cec8882205047, processorArchitecture=MSIL">
<HintPath>..\packages\NetOfficeFw.Core.1.8.1\lib\net40\VBIDEApi.dll</HintPath>
<EmbedInteropTypes>False</EmbedInteropTypes>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="Winsock Orcas">
<HintPath>..\DLL\Winsock Orcas.dll</HintPath>
@@ -351,6 +367,7 @@
<Compile Include="MessageWindow.cs" />
<Compile Include="MethodExtentions.cs" />
<Compile Include="Web\MachineBridge\MachineBridge.cs" />
<Compile Include="Web\MachineBridge\MachineBridge.HolidayRequest.cs" />
<Compile Include="Web\MachineBridge\MachineBridge.Login.cs" />
<Compile Include="Web\MachineBridge\MachineBridge.Dashboard.cs" />
<Compile Include="Web\MachineBridge\MachineBridge.Todo.cs" />
@@ -369,6 +386,8 @@
<Compile Include="Web\MachineBridge\MachineBridge.Customs.cs" />
<Compile Include="Web\MachineBridge\MachineBridge.UserGroup.cs" />
<Compile Include="Web\MachineBridge\MachineBridge.UserAuth.cs" />
<Compile Include="Web\MachineBridge\MachineBridge.License.cs" />
<Compile Include="Web\MachineBridge\MachineBridge.PartList.cs" />
<Compile Include="Web\MachineBridge\WebSocketServer.cs" />
<Compile Include="Web\Model\PageModel.cs" />
<Compile Include="Web\Model\ProjectModel.cs" />
@@ -744,7 +763,7 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Microsoft.Web.WebView2.1.0.2210.55\build\Microsoft.Web.WebView2.targets" Condition="Exists('..\packages\Microsoft.Web.WebView2.1.0.2210.55\build\Microsoft.Web.WebView2.targets')" />
<PropertyGroup>
<PostBuildEvent>xcopy /E /I /Y "$(ProjectDir)frontend\dist\*" "$(TargetDir)Web\Dist\"</PostBuildEvent>
<PostBuildEvent>rem xcopy /E /I /Y "$(ProjectDir)frontend\dist\*" "$(TargetDir)Web\Dist\"</PostBuildEvent>
</PropertyGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>

View File

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로
// 지정되도록 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("25.11.11.1030")]
[assembly: AssemblyFileVersion("25.11.11.1030")]
[assembly: AssemblyVersion("25.12.12.1050")]
[assembly: AssemblyFileVersion("25.12.12.1050")]

View File

@@ -42,7 +42,7 @@ namespace Project
var dbJR = new dsMSSQLTableAdapters.JobReportTableAdapter();
var taQuery = new DSQueryTableAdapters.QueriesTableAdapter();
var nd = DateTime.Now.ToShortDateString();
var nd = DateTime.Now.ToString("yyyy-MM-dd");
//이 날짜가 휴일인지 체크한다.
var Holyinfo = dbHL.GetData(nd).FirstOrDefault();// db.HolidayLIst.Where(t => t.pdate == nd).FirstOrDefault();
@@ -104,7 +104,7 @@ namespace Project
{
//자동로그인 업무일지 기록 기능 추가 = 210220
//select* from EETGW_JobReport_AutoInput where gcode = 'EET1P' and pdate <= '2021-02-20' and(edate is null or edate > '2021-02-20') and autoinput = 'L'
var nd = DateTime.Now.ToShortDateString();
var nd = DateTime.Now.ToString("yyyy-MM-dd");
var taQ = new DSQueryTableAdapters.QueriesTableAdapter();
var exist = taQ.ExistAutoInputData(FCOMMON.info.Login.gcode, FCOMMON.info.Login.no, nd) > 0;

View File

@@ -29,21 +29,27 @@ namespace Project.Web
var sql = @"
SELECT idx, bidx, header, cate, title, contents, [file], guid, url, wuid, wdate, project, pidx, gcode, [close], remark,
root_idx, depth, sort_order, thread_path, is_comment, reply_count,
dbo.getUserName(wuid) AS wuid_name
FROM Board WITH (nolock)
WHERE gcode = @gcode AND bidx = @bidx
FROM EETGW_Board WITH (nolock)
WHERE gcode = @gcode AND bidx = @bidx AND (is_comment IS NULL OR is_comment = 0)
AND (ISNULL(title,'') LIKE @search OR ISNULL(contents,'') LIKE @search OR ISNULL(wuid,'') LIKE @search)
ORDER BY wdate DESC";
ORDER BY
CASE WHEN root_idx IS NULL THEN idx ELSE root_idx END DESC,
thread_path ASC";
if(bidx == 5) //패치내역은 모두가 다 확인할 수있도록 그룹코드를 제한하지 않는다
{
sql = @"
SELECT idx, bidx, header, cate, title, contents, [file], guid, url, wuid, wdate, project, pidx, gcode, [close], remark,
root_idx, depth, sort_order, thread_path, is_comment, reply_count,
dbo.getUserName(wuid) AS wuid_name
FROM Board WITH (nolock)
WHERE bidx = @bidx
FROM EETGW_Board WITH (nolock)
WHERE bidx = @bidx AND (is_comment IS NULL OR is_comment = 0)
AND (ISNULL(title,'') LIKE @search OR ISNULL(contents,'') LIKE @search OR ISNULL(wuid,'') LIKE @search)
ORDER BY wdate DESC";
ORDER BY
CASE WHEN root_idx IS NULL THEN idx ELSE root_idx END DESC,
thread_path ASC";
}
var cmd = new SqlCommand(sql, conn);
@@ -75,7 +81,13 @@ namespace Project.Web
gcode = reader.IsDBNull(13) ? "" : reader.GetString(13),
close = reader.IsDBNull(14) ? false : reader.GetBoolean(14),
remark = reader.IsDBNull(15) ? "" : reader.GetString(15),
wuid_name = reader.IsDBNull(16) ? "" : reader.GetString(16)
root_idx = reader.IsDBNull(16) ? (int?)null : reader.GetInt32(16),
depth = reader.IsDBNull(17) ? 0 : reader.GetInt32(17),
sort_order = reader.IsDBNull(18) ? 0 : reader.GetInt32(18),
thread_path = reader.IsDBNull(19) ? "" : reader.GetString(19),
is_comment = reader.IsDBNull(20) ? false : reader.GetBoolean(20),
reply_count = reader.IsDBNull(21) ? 0 : reader.GetInt32(21),
wuid_name = reader.IsDBNull(22) ? "" : reader.GetString(22)
});
}
}
@@ -108,8 +120,9 @@ namespace Project.Web
var cmd = new SqlCommand(@"
SELECT idx, bidx, header, cate, title, contents, [file], guid, url, wuid, wdate, project, pidx, gcode, [close], remark,
root_idx, depth, sort_order, thread_path, is_comment, reply_count,
dbo.getUserName(wuid) AS wuid_name
FROM Board WITH (nolock)
FROM EETGW_Board WITH (nolock)
WHERE idx = @idx AND gcode = @gcode", conn);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
@@ -137,7 +150,13 @@ namespace Project.Web
gcode = reader.IsDBNull(13) ? "" : reader.GetString(13),
close = reader.IsDBNull(14) ? false : reader.GetBoolean(14),
remark = reader.IsDBNull(15) ? "" : reader.GetString(15),
wuid_name = reader.IsDBNull(16) ? "" : reader.GetString(16)
root_idx = reader.IsDBNull(16) ? (int?)null : reader.GetInt32(16),
depth = reader.IsDBNull(17) ? 0 : reader.GetInt32(17),
sort_order = reader.IsDBNull(18) ? 0 : reader.GetInt32(18),
thread_path = reader.IsDBNull(19) ? "" : reader.GetString(19),
is_comment = reader.IsDBNull(20) ? false : reader.GetBoolean(20),
reply_count = reader.IsDBNull(21) ? 0 : reader.GetInt32(21),
wuid_name = reader.IsDBNull(22) ? "" : reader.GetString(22)
};
return JsonConvert.SerializeObject(new { Success = true, Data = data });
@@ -173,9 +192,12 @@ namespace Project.Web
conn.Open();
var cmd = new SqlCommand(@"
INSERT INTO Board (bidx, header, cate, title, contents, wuid, wdate, gcode)
VALUES (@bidx, @header, @cate, @title, @contents, @wuid, GETDATE(), @gcode);
SELECT SCOPE_IDENTITY();", conn);
DECLARE @newIdx INT;
INSERT INTO EETGW_Board (bidx, header, cate, title, contents, wuid, wdate, gcode, depth, root_idx, thread_path, is_comment)
VALUES (@bidx, @header, @cate, @title, @contents, @wuid, GETDATE(), @gcode, 0, NULL, NULL, 0);
SET @newIdx = SCOPE_IDENTITY();
UPDATE EETGW_Board SET root_idx = @newIdx, thread_path = CAST(@newIdx AS VARCHAR(20)) WHERE idx = @newIdx;
SELECT @newIdx;", conn);
cmd.Parameters.Add("@bidx", SqlDbType.Int).Value = bidx;
cmd.Parameters.Add("@header", SqlDbType.NVarChar).Value = string.IsNullOrEmpty(header) ? (object)DBNull.Value : header;
@@ -214,7 +236,7 @@ namespace Project.Web
conn.Open();
// 권한 확인: 작성자 본인이거나 레벨 9 이상만 수정 가능
var checkCmd = new SqlCommand("SELECT wuid FROM Board WHERE idx = @idx", conn);
var checkCmd = new SqlCommand("SELECT wuid FROM EETGW_Board WHERE idx = @idx", conn);
checkCmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
var originalWuid = checkCmd.ExecuteScalar()?.ToString();
@@ -224,7 +246,7 @@ namespace Project.Web
}
var cmd = new SqlCommand(@"
UPDATE Board
UPDATE EETGW_Board
SET header = @header, cate = @cate, title = @title, contents = @contents
WHERE idx = @idx", conn);
@@ -270,7 +292,7 @@ namespace Project.Web
conn.Open();
// 권한 확인: 작성자 본인이거나 레벨 9 이상만 삭제 가능
var checkCmd = new SqlCommand("SELECT wuid FROM Board WHERE idx = @idx", conn);
var checkCmd = new SqlCommand("SELECT wuid FROM EETGW_Board WHERE idx = @idx", conn);
checkCmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
var originalWuid = checkCmd.ExecuteScalar()?.ToString();
@@ -279,7 +301,20 @@ namespace Project.Web
return JsonConvert.SerializeObject(new { Success = false, Message = "삭제 권한이 없습니다." });
}
var cmd = new SqlCommand("DELETE FROM Board WHERE idx = @idx", conn);
// 답글 존재 여부 확인 (is_comment=false인 답글만)
var replyCheckCmd = new SqlCommand(@"
SELECT COUNT(*)
FROM EETGW_Board
WHERE root_idx = @idx AND depth > 0 AND (is_comment IS NULL OR is_comment = 0)", conn);
replyCheckCmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
var replyCount = (int)replyCheckCmd.ExecuteScalar();
if (replyCount > 0)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "답글이 있는 게시글은 삭제할 수 없습니다. 답글을 먼저 삭제해주세요." });
}
var cmd = new SqlCommand("DELETE FROM EETGW_Board WHERE idx = @idx", conn);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
var affected = cmd.ExecuteNonQuery();
@@ -299,5 +334,150 @@ namespace Project.Web
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 댓글 목록 조회 (is_comment=true만)
/// </summary>
public string Board_GetReplies(int rootIdx)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
SELECT idx, bidx, header, cate, title, contents, [file], guid, url, wuid, wdate, project, pidx, gcode, [close], remark,
root_idx, depth, sort_order, thread_path, is_comment, reply_count,
dbo.getUserName(wuid) AS wuid_name
FROM EETGW_Board WITH (nolock)
WHERE root_idx = @rootIdx AND depth > 0 AND is_comment = 1
ORDER BY thread_path, wdate", conn);
cmd.Parameters.Add("@rootIdx", SqlDbType.Int).Value = rootIdx;
var list = new List<object>();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
list.Add(new
{
idx = reader.GetInt32(0),
bidx = reader.GetInt32(1),
header = reader.IsDBNull(2) ? "" : (reader.GetBoolean(2) ? "공지" : ""),
cate = reader.IsDBNull(3) ? "" : reader.GetString(3),
title = reader.IsDBNull(4) ? "" : reader.GetString(4),
contents = reader.IsDBNull(5) ? "" : reader.GetString(5),
file = reader.IsDBNull(6) ? "" : reader.GetString(6),
guid = reader.IsDBNull(7) ? "" : reader.GetString(7),
url = reader.IsDBNull(8) ? "" : reader.GetString(8),
wuid = reader.IsDBNull(9) ? "" : reader.GetString(9),
wdate = reader.IsDBNull(10) ? (DateTime?)null : reader.GetDateTime(10),
project = reader.IsDBNull(11) ? "" : reader.GetInt32(11).ToString(),
pidx = reader.IsDBNull(12) ? -1 : reader.GetInt32(12),
gcode = reader.IsDBNull(13) ? "" : reader.GetString(13),
close = reader.IsDBNull(14) ? false : reader.GetBoolean(14),
remark = reader.IsDBNull(15) ? "" : reader.GetString(15),
root_idx = reader.IsDBNull(16) ? (int?)null : reader.GetInt32(16),
depth = reader.IsDBNull(17) ? 0 : reader.GetInt32(17),
sort_order = reader.IsDBNull(18) ? 0 : reader.GetInt32(18),
thread_path = reader.IsDBNull(19) ? "" : reader.GetString(19),
is_comment = reader.IsDBNull(20) ? false : reader.GetBoolean(20),
reply_count = reader.IsDBNull(21) ? 0 : reader.GetInt32(21),
wuid_name = reader.IsDBNull(22) ? "" : reader.GetString(22)
});
}
}
return JsonConvert.SerializeObject(new { Success = true, Data = list });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 댓글/답글 추가
/// </summary>
public string Board_AddReply(int rootIdx, int pidx, string title, string contents, bool isComment)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
// 부모 글 정보 조회
var parentCmd = new SqlCommand(@"
SELECT bidx, gcode, depth, thread_path
FROM EETGW_Board
WHERE idx = @pidx", conn);
parentCmd.Parameters.Add("@pidx", SqlDbType.Int).Value = pidx;
int bidx = 0;
string gcode = "";
int parentDepth = 0;
string parentThreadPath = "";
using (var reader = parentCmd.ExecuteReader())
{
if (reader.Read())
{
bidx = reader.GetInt32(0);
gcode = reader.IsDBNull(1) ? "" : reader.GetString(1);
parentDepth = reader.IsDBNull(2) ? 0 : reader.GetInt32(2);
parentThreadPath = reader.IsDBNull(3) ? "" : reader.GetString(3);
}
else
{
return JsonConvert.SerializeObject(new { Success = false, Message = "부모 글을 찾을 수 없습니다." });
}
}
// 댓글/답글 삽입
var cmd = new SqlCommand(@"
DECLARE @newIdx INT;
INSERT INTO EETGW_Board (bidx, cate, title, contents, wuid, wdate, gcode, pidx, root_idx, depth, is_comment)
VALUES (@bidx, NULL, @title, @contents, @wuid, GETDATE(), @gcode, @pidx, @rootIdx, @depth, @isComment);
SET @newIdx = SCOPE_IDENTITY();
UPDATE EETGW_Board SET thread_path = @parentThreadPath + '/' + CAST(@newIdx AS VARCHAR(20)) WHERE idx = @newIdx;
SELECT @newIdx;", conn);
cmd.Parameters.Add("@bidx", SqlDbType.Int).Value = bidx;
cmd.Parameters.Add("@title", SqlDbType.NVarChar).Value = string.IsNullOrEmpty(title) ? (object)DBNull.Value : title;
cmd.Parameters.Add("@contents", SqlDbType.NVarChar).Value = contents;
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = string.IsNullOrEmpty(gcode) ? info.Login.gcode : gcode;
cmd.Parameters.Add("@pidx", SqlDbType.Int).Value = pidx;
cmd.Parameters.Add("@rootIdx", SqlDbType.Int).Value = rootIdx;
cmd.Parameters.Add("@depth", SqlDbType.Int).Value = parentDepth + 1;
cmd.Parameters.Add("@isComment", SqlDbType.Bit).Value = isComment;
cmd.Parameters.Add("@parentThreadPath", SqlDbType.VarChar).Value = parentThreadPath;
var newIdx = Convert.ToInt32(cmd.ExecuteScalar());
return JsonConvert.SerializeObject(new { Success = true, Message = "댓글이 등록되었습니다.", Data = new { idx = newIdx } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
}
}

View File

@@ -0,0 +1,166 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using Newtonsoft.Json;
using FCOMMON;
namespace Project.Web
{
public partial class MachineBridge
{
#region HolidayRequest API (/ )
/// <summary>
/// 휴가/외출 신청 목록 조회
/// </summary>
public string HolidayRequest_GetList(string startDate, string endDate, string userId, int userLevel)
{
try
{
// 권한에 따른 uid 필터링
// userLevel < 5: 본인만 조회
// userLevel >= 5: userId가 '%'이면 전체, 특정 uid면 해당 사용자만
var uidFilter = userLevel < 5 ? info.Login.no : (string.IsNullOrEmpty(userId) || userId == "%" ? "%" : userId);
var sql = @"
SELECT
hr.idx, hr.gcode, hr.uid, hr.cate, hr.sdate, hr.edate, hr.Remark, hr.wuid, hr.wdate,
u.dept, u.name, u.grade, u.tel, u.processs,
hr.Response, hr.conf, hr.HolyReason, hr.HolyBackup, hr.HolyLocation,
hr.HolyDays, hr.HolyTimes, hr.sendmail, hr.stime, hr.etime, hr.conf_id, hr.conf_time
FROM EETGW_HolydayRequest hr WITH (nolock)
LEFT OUTER JOIN vGroupUser u ON hr.uid = u.id AND hr.gcode = u.gcode
WHERE hr.gcode = @gcode
AND hr.sdate >= @startDate
AND hr.sdate <= @endDate
AND hr.uid LIKE @uid
ORDER BY hr.conf, hr.sdate DESC";
var cs = Properties.Settings.Default.gwcs;
using (var cn = new SqlConnection(cs))
using (var cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
cmd.Parameters.AddWithValue("@startDate", startDate);
cmd.Parameters.AddWithValue("@endDate", endDate);
cmd.Parameters.AddWithValue("@uid", uidFilter);
using (var da = new SqlDataAdapter(cmd))
{
var dt = new DataTable();
da.Fill(dt);
// 승인/미승인 합계 계산
decimal sumApprovedDays = 0;
decimal sumApprovedTimes = 0;
decimal sumPendingDays = 0;
decimal sumPendingTimes = 0;
foreach (DataRow row in dt.Rows)
{
var conf = Convert.ToInt32(row["conf"]);
var days = row["HolyDays"] != DBNull.Value ? Convert.ToDecimal(row["HolyDays"]) : 0;
var times = row["HolyTimes"] != DBNull.Value ? Convert.ToDecimal(row["HolyTimes"]) : 0;
if (conf == 1)
{
sumApprovedDays += days;
sumApprovedTimes += times;
}
else
{
sumPendingDays += days;
sumPendingTimes += times;
}
}
return JsonConvert.SerializeObject(new
{
Success = true,
Data = dt,
Summary = new
{
ApprovedDays = sumApprovedDays,
ApprovedTimes = sumApprovedTimes,
PendingDays = sumPendingDays,
PendingTimes = sumPendingTimes
}
});
}
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 휴가/외출 신청 저장
/// </summary>
public string HolidayRequest_Save(int idx, string uid, string cate, string sdate, string edate,
string remark, string response, int conf, string holyReason, string holyBackup,
string holyLocation, decimal holyDays, decimal holyTimes, string stime, string etime)
{
try
{
var cs = Properties.Settings.Default.gwcs;
using (var cn = new SqlConnection(cs))
{
cn.Open();
var sql = "";
if (idx == 0) // INSERT
{
sql = @"INSERT INTO EETGW_HolydayRequest
(gcode, uid, cate, sdate, edate, conf, Remark, wuid, wdate, Response,
HolyReason, HolyBackup, HolyLocation, HolyDays, HolyTimes, stime, etime)
VALUES
(@gcode, @uid, @cate, @sdate, @edate, @conf, @remark, @wuid, GETDATE(), @response,
@holyReason, @holyBackup, @holyLocation, @holyDays, @holyTimes, @stime, @etime)";
}
else // UPDATE
{
sql = @"UPDATE EETGW_HolydayRequest
SET uid = @uid, cate = @cate, sdate = @sdate, edate = @edate, conf = @conf,
Remark = @remark, Response = @response, HolyReason = @holyReason,
HolyBackup = @holyBackup, HolyLocation = @holyLocation,
HolyDays = @holyDays, HolyTimes = @holyTimes, stime = @stime, etime = @etime
WHERE idx = @idx AND gcode = @gcode";
}
using (var cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.AddWithValue("@idx", idx);
cmd.Parameters.AddWithValue("@gcode", info.Login.gcode);
cmd.Parameters.AddWithValue("@uid", uid);
cmd.Parameters.AddWithValue("@cate", cate);
cmd.Parameters.AddWithValue("@sdate", sdate);
cmd.Parameters.AddWithValue("@edate", edate);
cmd.Parameters.AddWithValue("@conf", conf);
cmd.Parameters.AddWithValue("@remark", remark ?? "");
cmd.Parameters.AddWithValue("@wuid", info.Login.no); // 작성자
cmd.Parameters.AddWithValue("@response", response ?? "");
cmd.Parameters.AddWithValue("@holyReason", holyReason ?? "");
cmd.Parameters.AddWithValue("@holyBackup", holyBackup ?? "");
cmd.Parameters.AddWithValue("@holyLocation", holyLocation ?? "");
cmd.Parameters.AddWithValue("@holyDays", holyDays);
cmd.Parameters.AddWithValue("@holyTimes", holyTimes);
cmd.Parameters.AddWithValue("@stime", stime ?? "");
cmd.Parameters.AddWithValue("@etime", etime ?? "");
cmd.ExecuteNonQuery();
}
}
return JsonConvert.SerializeObject(new { Success = true, Message = "저장되었습니다." });
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
#endregion
}
}

View File

@@ -0,0 +1,320 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Text;
using Newtonsoft.Json;
using FCOMMON;
namespace Project.Web
{
public partial class MachineBridge
{
/// <summary>
/// 라이선스 목록 조회
/// </summary>
public string License_GetList()
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
SELECT
idx, gcode, expire, name, Version, MeterialNo, Supply, qty,
uids, SerialNo, Remark, sdate, edate, manu, wuid, wdate
FROM EETGW_License WITH (nolock)
WHERE gcode = @gcode
ORDER BY expire DESC, name, sdate", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
var list = new List<object>();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
list.Add(new
{
idx = reader.GetInt32(0),
gcode = reader.IsDBNull(1) ? "" : reader.GetString(1),
expire = !reader.IsDBNull(2) && reader.GetBoolean(2),
name = reader.IsDBNull(3) ? "" : reader.GetString(3),
version = reader.IsDBNull(4) ? "" : reader.GetString(4),
meterialNo = reader.IsDBNull(5) ? "" : reader.GetString(5),
supply = reader.IsDBNull(6) ? "" : reader.GetString(6),
qty = reader.IsDBNull(7) ? 0 : reader.GetInt32(7),
uids = reader.IsDBNull(8) ? "" : reader.GetString(8),
serialNo = reader.IsDBNull(9) ? "" : reader.GetString(9),
remark = reader.IsDBNull(10) ? "" : reader.GetString(10),
sdate = reader.IsDBNull(11) ? "" : reader.GetString(11),
edate = reader.IsDBNull(12) ? "" : reader.GetString(12),
manu = reader.IsDBNull(13) ? "" : reader.GetString(13),
wuid = reader.IsDBNull(14) ? "" : reader.GetString(14),
wdate = reader.IsDBNull(15) ? "" : reader.GetDateTime(15).ToString("yyyy-MM-dd HH:mm:ss")
});
}
}
return JsonConvert.SerializeObject(new { Success = true, Data = list });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "라이선스 목록 조회 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// 라이선스 추가
/// </summary>
public string License_Add(string name, string version, string meterialNo, string supply,
int qty, string uids, string serialNo, string remark, string sdate, string edate,
string manu, bool expire)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
INSERT INTO EETGW_License
(gcode, expire, name, manu, Supply, qty, uids, sdate, edate, Remark, wuid, wdate, Version, SerialNo, MeterialNo)
VALUES
(@gcode, @expire, @name, @manu, @Supply, @qty, @uids, @sdate, @edate, @Remark, @wuid, @wdate, @Version, @SerialNo, @MeterialNo);
SELECT SCOPE_IDENTITY();", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
cmd.Parameters.Add("@expire", SqlDbType.Bit).Value = expire;
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = name ?? "";
cmd.Parameters.Add("@manu", SqlDbType.NVarChar).Value = manu ?? "";
cmd.Parameters.Add("@Supply", SqlDbType.NVarChar).Value = supply ?? "";
cmd.Parameters.Add("@qty", SqlDbType.Int).Value = qty;
cmd.Parameters.Add("@uids", SqlDbType.NVarChar).Value = uids ?? "";
cmd.Parameters.Add("@sdate", SqlDbType.VarChar).Value = string.IsNullOrEmpty(sdate) ? DateTime.Now.ToString("yyyy-MM-dd") : sdate;
cmd.Parameters.Add("@edate", SqlDbType.VarChar).Value = (object)edate ?? DBNull.Value;
cmd.Parameters.Add("@Remark", SqlDbType.NVarChar).Value = remark ?? "";
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
cmd.Parameters.Add("@wdate", SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add("@Version", SqlDbType.NVarChar).Value = version ?? "";
cmd.Parameters.Add("@SerialNo", SqlDbType.NVarChar).Value = serialNo ?? "";
cmd.Parameters.Add("@MeterialNo", SqlDbType.NVarChar).Value = meterialNo ?? "";
var idx = Convert.ToInt32(cmd.ExecuteScalar());
return JsonConvert.SerializeObject(new { Success = true, Message = "라이선스가 추가되었습니다.", Data = new { idx } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "라이선스 추가 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// 라이선스 수정
/// </summary>
public string License_Update(int idx, string name, string version, string meterialNo,
string supply, int qty, string uids, string serialNo, string remark, string sdate,
string edate, string manu, bool expire)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
UPDATE EETGW_License SET
expire = @expire, name = @name, manu = @manu, Supply = @Supply,
qty = @qty, uids = @uids, sdate = @sdate, edate = @edate,
Remark = @Remark, wuid = @wuid, wdate = @wdate,
Version = @Version, SerialNo = @SerialNo, MeterialNo = @MeterialNo
WHERE idx = @idx AND gcode = @gcode", conn);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
cmd.Parameters.Add("@expire", SqlDbType.Bit).Value = expire;
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = name ?? "";
cmd.Parameters.Add("@manu", SqlDbType.NVarChar).Value = manu ?? "";
cmd.Parameters.Add("@Supply", SqlDbType.NVarChar).Value = supply ?? "";
cmd.Parameters.Add("@qty", SqlDbType.Int).Value = qty;
cmd.Parameters.Add("@uids", SqlDbType.NVarChar).Value = uids ?? "";
cmd.Parameters.Add("@sdate", SqlDbType.VarChar).Value = string.IsNullOrEmpty(sdate) ? DateTime.Now.ToString("yyyy-MM-dd") : sdate;
cmd.Parameters.Add("@edate", SqlDbType.VarChar).Value = (object)edate ?? DBNull.Value;
cmd.Parameters.Add("@Remark", SqlDbType.NVarChar).Value = remark ?? "";
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
cmd.Parameters.Add("@wdate", SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add("@Version", SqlDbType.NVarChar).Value = version ?? "";
cmd.Parameters.Add("@SerialNo", SqlDbType.NVarChar).Value = serialNo ?? "";
cmd.Parameters.Add("@MeterialNo", SqlDbType.NVarChar).Value = meterialNo ?? "";
var cnt = cmd.ExecuteNonQuery();
return JsonConvert.SerializeObject(new { Success = true, Message = "라이선스가 수정되었습니다.", Data = new { UpdatedCount = cnt } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "라이선스 수정 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// 라이선스 삭제
/// </summary>
public string License_Delete(int idx)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
DELETE FROM EETGW_License
WHERE idx = @idx AND gcode = @gcode", conn);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
var cnt = cmd.ExecuteNonQuery();
return JsonConvert.SerializeObject(new { Success = true, Message = "라이선스가 삭제되었습니다.", Data = new { DeletedCount = cnt } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "라이선스 삭제 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// 라이선스 폴더 열기
/// </summary>
public string License_OpenFolder(int idx)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var serverpath = DBM.getCodeSvalue("55", "01");
if (string.IsNullOrEmpty(serverpath) || !Directory.Exists(serverpath))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "프로젝트 기본경로가 존재하지 않습니다.\\n\\n공용정보->공용코드->55-01 데이터를 설정 하시기 바랍니다." });
}
var folderPath = Path.Combine(serverpath, "Data", "License", idx.ToString());
// 폴더가 없으면 생성
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
// 탐색기로 폴더 열기
Process.Start("explorer.exe", folderPath);
return JsonConvert.SerializeObject(new { Success = true, Message = "폴더를 열었습니다.", Data = new { Path = folderPath } });
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "폴더 열기 중 오류가 발생했습니다: " + ex.Message });
}
}
/// <summary>
/// CSV로 내보내기
/// </summary>
public string License_ExportCSV(string filePath)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
SELECT
idx, expire, name, Version, MeterialNo, Supply, qty,
uids, SerialNo, Remark, sdate, edate, manu
FROM EETGW_License WITH (nolock)
WHERE gcode = @gcode
ORDER BY expire DESC, name, sdate", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
var sb = new StringBuilder();
sb.AppendLine("idx,expire,name,Version,MeterialNo,Supply,qty,uids,SerialNo,Remark,sdate,edate,manu");
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var values = new List<string>();
for (int i = 0; i < reader.FieldCount; i++)
{
var value = reader.IsDBNull(i) ? "" : reader.GetValue(i).ToString();
// CSV 이스케이프 처리
if (value.Contains(",") || value.Contains("\"") || value.Contains("\n"))
{
value = "\"" + value.Replace("\"", "\"\"") + "\"";
}
values.Add(value);
}
sb.AppendLine(string.Join(",", values));
}
}
File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8);
return JsonConvert.SerializeObject(new { Success = true, Message = "CSV 파일이 생성되었습니다.", Data = new { Path = filePath } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "CSV 내보내기 중 오류가 발생했습니다: " + ex.Message });
}
}
}
}

View File

@@ -5,6 +5,9 @@ using System.Data;
using System.Data.SqlClient;
using System.Linq;
using FCOMMON;
using NetOffice;
using Outlook = NetOffice.OutlookApi;
using NetOffice.OutlookApi.Enums;
namespace Project.Web
{
@@ -71,5 +74,164 @@ namespace Project.Web
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 메일 데이터 추가 (발송 대기열)
/// </summary>
public string Mail_AddData(string cate, string subject, string fromlist, string tolist, string cc, string bcc, string body)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
INSERT INTO MailData
(gcode, cate, pdate, subject, fromlist, tolist, cc, bcc, body, SendOK, wuid, wdate)
VALUES
(@gcode, @cate, @pdate, @subject, @fromlist, @tolist, @cc, @bcc, @body, 0, @wuid, GETDATE())", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
cmd.Parameters.Add("@cate", SqlDbType.VarChar).Value = cate ?? "";
cmd.Parameters.Add("@pdate", SqlDbType.VarChar).Value = DateTime.Now.ToString("yyyy-MM-dd");
cmd.Parameters.Add("@subject", SqlDbType.VarChar).Value = subject ?? "";
cmd.Parameters.Add("@fromlist", SqlDbType.VarChar).Value = fromlist ?? "";
cmd.Parameters.Add("@tolist", SqlDbType.VarChar).Value = tolist ?? "";
cmd.Parameters.Add("@cc", SqlDbType.VarChar).Value = cc ?? "";
cmd.Parameters.Add("@bcc", SqlDbType.VarChar).Value = bcc ?? "";
cmd.Parameters.Add("@body", SqlDbType.VarChar).Value = body ?? "";
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
int affected = cmd.ExecuteNonQuery();
if (affected > 0)
{
return JsonConvert.SerializeObject(new { Success = true, Message = "메일이 발송 대기열에 추가되었습니다." });
}
else
{
return JsonConvert.SerializeObject(new { Success = false, Message = "메일 등록에 실패했습니다." });
}
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 메일 직접 발송 (SMTP)
/// </summary>
public string Mail_SendDirect(string cate, string subject, string fromlist, string tolist, string cc, string bcc, string body)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
// SMTP 직접 발송
var mailserver = info.mailserver ?? "scwa.amkor.co.kr";
var mc = new System.Net.Mail.SmtpClient(mailserver);
var msg = new System.Net.Mail.MailMessage(
string.IsNullOrEmpty(fromlist) ? "gw@amkor.co.kr" : fromlist,
tolist,
subject,
body
);
if (!string.IsNullOrEmpty(bcc)) msg.Bcc.Add(bcc);
if (!string.IsNullOrEmpty(cc)) msg.CC.Add(cc);
msg.IsBodyHtml = true;
mc.Send(msg);
// 발송 성공 시 MailData에도 저장 (SendOK=1)
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
INSERT INTO MailData
(gcode, cate, pdate, subject, fromlist, tolist, cc, bcc, body, SendOK, SendMsg, wuid, wdate, suid, sdate)
VALUES
(@gcode, @cate, @pdate, @subject, @fromlist, @tolist, @cc, @bcc, @body, 1, @SendMsg, @wuid, GETDATE(), @wuid, GETDATE())", conn);
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
cmd.Parameters.Add("@cate", SqlDbType.VarChar).Value = cate ?? "";
cmd.Parameters.Add("@pdate", SqlDbType.VarChar).Value = DateTime.Now.ToString("yyyy-MM-dd");
cmd.Parameters.Add("@subject", SqlDbType.VarChar).Value = subject ?? "";
cmd.Parameters.Add("@fromlist", SqlDbType.VarChar).Value = string.IsNullOrEmpty(fromlist) ? "gw@amkor.co.kr" : fromlist;
cmd.Parameters.Add("@tolist", SqlDbType.VarChar).Value = tolist ?? "";
cmd.Parameters.Add("@cc", SqlDbType.VarChar).Value = cc ?? "";
cmd.Parameters.Add("@bcc", SqlDbType.VarChar).Value = bcc ?? "";
cmd.Parameters.Add("@body", SqlDbType.VarChar).Value = body ?? "";
cmd.Parameters.Add("@SendMsg", SqlDbType.VarChar).Value = "Direct Send";
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
cmd.ExecuteNonQuery();
}
return JsonConvert.SerializeObject(new { Success = true, Message = "메일이 발송되었습니다." });
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = $"메일 발송 실패: {ex.Message}" });
}
}
/// <summary>
/// Outlook으로 메일 미리보기/발송
/// </summary>
public string Mail_SendOutlook(string subject, string _tolist, string cc, string bcc, string body)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
// Outlook COM 객체 생성
var tolist = new string[] { "Chikyun.kim@amkor.co.kr" }; //dr.tolist.Split(',');
Outlook.Application outlookApplication = new Outlook.Application();
foreach (var to in tolist)
{
if (to.isEmpty()) continue;
var newMail = outlookApplication.CreateItem(OlItemType.olMailItem) as Outlook.MailItem;
newMail.Display();
newMail.Subject = subject.Trim(); // dr.title;
newMail.To = to;
newMail.CC = cc;
newMail.BCC = bcc;
// newMail.BodyFormat = OlBodyFormat.olFormatHTML;
newMail.HTMLBody = body
.Replace("{USER}", FCOMMON.info.Login.nameK)
.Replace("{EUSER}", FCOMMON.info.Login.nameE)
.Replace("{EMAIL}", FCOMMON.info.Login.email)
.Replace("%7BEMAIL%7D", FCOMMON.info.Login.email)
.Replace("{HP}", FCOMMON.info.Login.hp)
.Replace("{TEL}", FCOMMON.info.Login.tel)
.Replace("{ITEM}", subject) + newMail.HTMLBody;
}
return JsonConvert.SerializeObject(new { Success = true, Message = "Outlook 메일 창이 열렸습니다." });
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = $"Outlook 실행 실패: {ex.Message}" });
}
}
}
}

View File

@@ -0,0 +1,247 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using Newtonsoft.Json;
using FCOMMON;
namespace Project.Web
{
public partial class MachineBridge
{
/// <summary>
/// 프로젝트별 파트리스트 조회
/// </summary>
public string PartList_GetList(int projectIdx)
{
try
{
var connStr = Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
SELECT
idx, no, Project, ItemGroup, ItemModel, ItemUnit, ItemName,
ItemSid, ItemSupply, ItemSupplyidx, ItemManu, Item,
option1, qty, qtyn, price, amt, remark, qtybuy
FROM ProjectsPart
WHERE Project = @ProjectIdx
ORDER BY ItemGroup, option1, no, ItemName
", conn);
cmd.Parameters.Add("@ProjectIdx", SqlDbType.Int).Value = projectIdx;
var list = new List<object>();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
list.Add(new
{
idx = reader.GetInt32(0),
no = reader.IsDBNull(1) ? 0 : reader.GetInt32(1),
Project = reader.GetInt32(2),
itemgroup = reader.IsDBNull(3) ? "" : reader.GetString(3),
itemmodel = reader.IsDBNull(4) ? "" : reader.GetString(4),
itemunit = reader.IsDBNull(5) ? "" : reader.GetString(5),
itemname = reader.IsDBNull(6) ? "" : reader.GetString(6),
itemsid = reader.IsDBNull(7) ? "" : reader.GetString(7),
itemsupply = reader.IsDBNull(8) ? "" : reader.GetString(8),
itemsupplyidx = reader.IsDBNull(9) ? 0 : reader.GetInt32(9),
itemmanu = reader.IsDBNull(10) ? "" : reader.GetString(10),
item = reader.IsDBNull(11) ? "" : reader.GetInt32(11).ToString(),
option1 = reader.IsDBNull(12) ? "" : reader.GetString(12),
qty = reader.IsDBNull(13) ? 0 : reader.GetInt32(13),
qtyn = reader.IsDBNull(14) ? 0 : reader.GetInt32(14),
price = reader.IsDBNull(15) ? 0.0 : (double)reader.GetDecimal(15),
amt = reader.IsDBNull(16) ? 0.0 : (double)reader.GetDecimal(16),
remark = reader.IsDBNull(17) ? "" : reader.GetString(17),
qtybuy = reader.IsDBNull(18) ? 0 : reader.GetInt32(18)
});
}
} var result = new
{
Success = true,
Data = list
};
return JsonConvert.SerializeObject(result);
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new
{
Success = false,
Message = "파트리스트 조회 실패: " + ex.Message
});
}
}
/// <summary>
/// 파트리스트 항목 저장 (추가/수정)
/// </summary>
public string PartList_Save(
int idx,
int projectIdx,
string itemgroup,
string itemname,
string item,
string itemmodel,
string itemscale,
string itemunit,
double qty,
double price,
string itemsupply,
int itemsupplyidx,
string itemmanu,
string itemsid,
string option1,
string remark,
int no,
double qtybuy)
{
try
{
var connStr = Properties.Settings.Default.CS;
using (var con = new SqlConnection(connStr))
{
con.Open();
if (idx == 0 || idx == -1) // 새로 추가
{
using (var cmd = new SqlCommand(@"
INSERT INTO ProjectsPart (
Project, ItemGroup, ItemName, Item, ItemModel,
ItemUnit, Qty, Price, ItemSupply,
ItemSupplyIdx, ItemManu, ItemSid, option1,
remark, no, qtybuy, wuid, wdate
) VALUES (
@Project, @ItemGroup, @ItemName, @Item, @ItemModel,
@ItemUnit, @Qty, @Price, @ItemSupply,
@ItemSupplyIdx, @ItemManu, @ItemSid, @option1,
@remark, @no, @qtybuy, @wuid, @wdate
)
", con))
{
cmd.Parameters.AddWithValue("@Project", projectIdx);
cmd.Parameters.AddWithValue("@ItemGroup", itemgroup ?? "");
cmd.Parameters.AddWithValue("@ItemName", itemname ?? "");
cmd.Parameters.AddWithValue("@Item", item ?? "");
cmd.Parameters.AddWithValue("@ItemModel", itemmodel ?? "");
cmd.Parameters.AddWithValue("@ItemUnit", itemunit ?? "");
cmd.Parameters.AddWithValue("@Qty", qty);
cmd.Parameters.AddWithValue("@Price", price);
cmd.Parameters.AddWithValue("@ItemSupply", itemsupply ?? "");
cmd.Parameters.AddWithValue("@ItemSupplyIdx", itemsupplyidx);
cmd.Parameters.AddWithValue("@ItemManu", itemmanu ?? "");
cmd.Parameters.AddWithValue("@ItemSid", itemsid ?? "");
cmd.Parameters.AddWithValue("@option1", option1 ?? "");
cmd.Parameters.AddWithValue("@remark", remark ?? "");
cmd.Parameters.AddWithValue("@no", no);
cmd.Parameters.AddWithValue("@qtybuy", qtybuy);
cmd.Parameters.AddWithValue("@wuid", info.Login.no);
cmd.Parameters.AddWithValue("@wdate", DateTime.Now);
cmd.ExecuteNonQuery();
}
}
else // 수정
{
using (var cmd = new SqlCommand(@"
UPDATE ProjectsPart SET
ItemGroup = @ItemGroup,
ItemName = @ItemName,
Item = @Item,
ItemModel = @ItemModel,
ItemUnit = @ItemUnit,
Qty = @Qty,
Price = @Price,
ItemSupply = @ItemSupply,
ItemSupplyIdx = @ItemSupplyIdx,
ItemManu = @ItemManu,
ItemSid = @ItemSid,
option1 = @option1,
remark = @remark,
no = @no,
qtybuy = @qtybuy
WHERE idx = @idx
", con))
{
cmd.Parameters.AddWithValue("@idx", idx);
cmd.Parameters.AddWithValue("@ItemGroup", itemgroup ?? "");
cmd.Parameters.AddWithValue("@ItemName", itemname ?? "");
cmd.Parameters.AddWithValue("@Item", item ?? "");
cmd.Parameters.AddWithValue("@ItemModel", itemmodel ?? "");
cmd.Parameters.AddWithValue("@ItemUnit", itemunit ?? "");
cmd.Parameters.AddWithValue("@Qty", qty);
cmd.Parameters.AddWithValue("@Price", price);
cmd.Parameters.AddWithValue("@ItemSupply", itemsupply ?? "");
cmd.Parameters.AddWithValue("@ItemSupplyIdx", itemsupplyidx);
cmd.Parameters.AddWithValue("@ItemManu", itemmanu ?? "");
cmd.Parameters.AddWithValue("@ItemSid", itemsid ?? "");
cmd.Parameters.AddWithValue("@option1", option1 ?? "");
cmd.Parameters.AddWithValue("@remark", remark ?? "");
cmd.Parameters.AddWithValue("@no", no);
cmd.Parameters.AddWithValue("@qtybuy", qtybuy);
cmd.ExecuteNonQuery();
}
}
return JsonConvert.SerializeObject(new
{
Success = true,
Message = "저장되었습니다."
});
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new
{
Success = false,
Message = "저장 실패: " + ex.Message
});
}
}
/// <summary>
/// 파트리스트 항목 삭제
/// </summary>
public string PartList_Delete(int idx)
{
try
{
var connStr = Properties.Settings.Default.CS;
using (var con = new SqlConnection(connStr))
{
con.Open();
var cmd = new SqlCommand(@"
DELETE FROM ProjectsPart WHERE idx = @idx
", con);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
cmd.ExecuteNonQuery();
return JsonConvert.SerializeObject(new
{
Success = true,
Message = "삭제되었습니다."
});
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new
{
Success = false,
Message = "삭제 실패: " + ex.Message
});
}
}
}
}

View File

@@ -227,8 +227,15 @@ namespace Project.Web
FROM Projects WITH (nolock)
WHERE gcode = @gcode
AND (name LIKE @keyword OR CAST(idx AS VARCHAR) LIKE @keyword)
AND status NOT IN ('보류', '취소', '완료(보고)')
ORDER BY status DESC, pdate DESC, name";
AND status NOT IN ('보류', '취소')
ORDER BY
CASE
WHEN status = '진행' THEN 1
WHEN status = '준비' THEN 2
WHEN status = '완료(보고)' THEN 3
ELSE 4
END,
pdate DESC, name";
using (var cn = new SqlConnection(cs))
using (var cmd = new SqlCommand(sqlProjects, cn))
@@ -599,6 +606,64 @@ namespace Project.Web
}
}
/// <summary>
/// 프로젝트 히스토리 저장
/// </summary>
public string Project_SaveHistory(int idx, int pidx, string pdate, int progress, string remark)
{
try
{
var cs = Properties.Settings.Default.gwcs;
using (var cn = new SqlConnection(cs))
{
cn.Open();
string sql;
if (idx > 0)
{
// 수정
sql = @"UPDATE ProjectsHistory
SET remark = @remark, progress = @progress, wdate = GETDATE(), wuid = @wuid
WHERE idx = @idx";
}
else
{
// 신규 등록
sql = @"INSERT INTO ProjectsHistory (pidx, pdate, progress, remark, wuid, wdate)
VALUES (@pidx, @pdate, @progress, @remark, @wuid, GETDATE())";
}
using (var cmd = new SqlCommand(sql, cn))
{
if (idx > 0)
{
cmd.Parameters.AddWithValue("@idx", idx);
}
cmd.Parameters.AddWithValue("@pidx", pidx);
cmd.Parameters.AddWithValue("@pdate", pdate);
cmd.Parameters.AddWithValue("@progress", progress);
cmd.Parameters.AddWithValue("@remark", remark ?? "");
cmd.Parameters.AddWithValue("@wuid", info.Login.no);
int affected = cmd.ExecuteNonQuery();
if (affected > 0)
{
return JsonConvert.SerializeObject(new { Success = true, Message = "저장되었습니다." });
}
else
{
return JsonConvert.SerializeObject(new { Success = false, Message = "저장에 실패했습니다." });
}
}
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 프로젝트 일일 메모 조회
/// </summary>

View File

@@ -101,12 +101,27 @@ namespace Project.Web
{
try
{
var productVersion = Application.ProductVersion;
var maxVersion = DBM.GetMaxVersion();
var hasNewVersion = false;
if (!string.IsNullOrEmpty(maxVersion))
{
var verchk = productVersion.CompareTo(maxVersion);
if (verchk < 0)
{
hasNewVersion = true;
}
}
return JsonConvert.SerializeObject(new
{
Success = true,
ProductName = Application.ProductName,
ProductVersion = Application.ProductVersion,
DisplayVersion = $"{Application.ProductName} v{Application.ProductVersion}"
ProductVersion = productVersion,
DisplayVersion = $"{Application.ProductName} v{productVersion}",
MaxVersion = maxVersion,
HasNewVersion = hasNewVersion
});
}
catch (Exception ex)

View File

@@ -599,6 +599,7 @@ namespace Project.Web
}
break;
// ===== JobReport API (JobReport 뷰/테이블) =====
case "JOBREPORT_GET_LIST":
{
@@ -607,9 +608,10 @@ namespace Project.Web
string uid = json.uid ?? "";
string cate = json.cate ?? ""; // 사용안함 (호환성)
string searchKey = json.searchKey ?? "";
string requestId = json.requestId;
Console.WriteLine($"[WS] JOBREPORT_GET_LIST: sd={sd}, ed={ed}, uid={uid}, searchKey={searchKey}");
string result = _bridge.Jobreport_GetList(sd, ed, uid, cate, searchKey);
var response = new { type = "JOBREPORT_LIST_DATA", data = JsonConvert.DeserializeObject(result) };
var response = new { type = "JOBREPORT_LIST_DATA", data = JsonConvert.DeserializeObject(result), requestId = requestId };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
@@ -952,6 +954,28 @@ namespace Project.Web
}
break;
case "BOARD_GET_REPLIES":
{
int rootIdx = json.rootIdx ?? 0;
string result = _bridge.Board_GetReplies(rootIdx);
var response = new { type = "BOARD_REPLIES_DATA", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "BOARD_ADD_REPLY":
{
int rootIdx = json.rootIdx ?? 0;
int pidx = json.pidx ?? 0;
string title = json.title ?? "";
string contents = json.contents ?? "";
bool isComment = json.isComment ?? false;
string result = _bridge.Board_AddReply(rootIdx, pidx, title, contents, isComment);
var response = new { type = "BOARD_REPLY_ADDED", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
// ===== Mail API (메일 발신 내역) =====
case "MAIL_GET_LIST":
{
@@ -964,6 +988,171 @@ namespace Project.Web
}
break;
case "MAIL_ADD_DATA":
{
string cate = json.cate ?? "";
string subject = json.subject ?? "";
string fromlist = json.fromlist ?? "";
string tolist = json.tolist ?? "";
string cc = json.cc ?? "";
string bcc = json.bcc ?? "";
string body = json.body ?? "";
string result = _bridge.Mail_AddData(cate, subject, fromlist, tolist, cc, bcc, body);
var response = new { type = "MAIL_ADD_DATA_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "MAIL_SEND_DIRECT":
{
string cate = json.cate ?? "";
string subject = json.subject ?? "";
string fromlist = json.fromlist ?? "";
string tolist = json.tolist ?? "";
string cc = json.cc ?? "";
string bcc = json.bcc ?? "";
string body = json.body ?? "";
string result = _bridge.Mail_SendDirect(cate, subject, fromlist, tolist, cc, bcc, body);
var response = new { type = "MAIL_SEND_DIRECT_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "MAIL_SEND_OUTLOOK":
{
string subject = json.subject ?? "";
string tolist = json.tolist ?? "";
string cc = json.cc ?? "";
string bcc = json.bcc ?? "";
string body = json.body ?? "";
string result = _bridge.Mail_SendOutlook(subject, tolist, cc, bcc, body);
var response = new { type = "MAIL_SEND_OUTLOOK_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
// ===== License API (라이선스 관리) =====
case "LICENSE_GET_LIST":
{
string result = _bridge.License_GetList();
var response = new { type = "LICENSE_LIST_DATA", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_ADD":
{
string name = json.name ?? "";
string version = json.version ?? "";
string meterialNo = json.meterialNo ?? "";
string supply = json.supply ?? "";
int qty = json.qty ?? 0;
string uids = json.uids ?? "";
string serialNo = json.serialNo ?? "";
string remark = json.remark ?? "";
string sdate = json.sdate ?? "";
string edate = json.edate ?? "";
string manu = json.manu ?? "";
bool expire = json.expire ?? false;
string result = _bridge.License_Add(name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire);
var response = new { type = "LICENSE_ADD_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_UPDATE":
{
int idx = json.idx ?? 0;
string name = json.name ?? "";
string version = json.version ?? "";
string meterialNo = json.meterialNo ?? "";
string supply = json.supply ?? "";
int qty = json.qty ?? 0;
string uids = json.uids ?? "";
string serialNo = json.serialNo ?? "";
string remark = json.remark ?? "";
string sdate = json.sdate ?? "";
string edate = json.edate ?? "";
string manu = json.manu ?? "";
bool expire = json.expire ?? false;
string result = _bridge.License_Update(idx, name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire);
var response = new { type = "LICENSE_UPDATE_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_DELETE":
{
int idx = json.idx ?? 0;
string result = _bridge.License_Delete(idx);
var response = new { type = "LICENSE_DELETE_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_OPEN_FOLDER":
{
int idx = json.idx ?? 0;
string result = _bridge.License_OpenFolder(idx);
var response = new { type = "LICENSE_OPEN_FOLDER_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "LICENSE_EXPORT_CSV":
{
string filePath = json.filePath ?? "";
string result = _bridge.License_ExportCSV(filePath);
var response = new { type = "LICENSE_EXPORT_CSV_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
// ===== PartList API (파트리스트) =====
case "PARTLIST_GET_LIST":
{
int projectIdx = json.projectIdx ?? 0;
string result = _bridge.PartList_GetList(projectIdx);
var response = new { type = "PARTLIST_LIST_DATA", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "PARTLIST_SAVE":
{
int idx = json.idx ?? 0;
int projectIdx = json.projectIdx ?? 0;
string itemgroup = json.itemgroup ?? "";
string itemname = json.itemname ?? "";
string item = json.item ?? "";
string itemmodel = json.itemmodel ?? "";
string itemscale = json.itemscale ?? "";
string itemunit = json.itemunit ?? "";
double qty = json.qty ?? 0.0;
double price = json.price ?? 0.0;
string itemsupply = json.itemsupply ?? "";
int itemsupplyidx = json.itemsupplyidx ?? 0;
string itemmanu = json.itemmanu ?? "";
string itemsid = json.itemsid ?? "";
string option1 = json.option1 ?? "";
string remark = json.remark ?? "";
int no = json.no ?? 0;
double qtybuy = json.qtybuy ?? 0.0;
string result = _bridge.PartList_Save(idx, projectIdx, itemgroup, itemname, item, itemmodel, itemscale, itemunit, qty, price, itemsupply, itemsupplyidx, itemmanu, itemsid, option1, remark, no, qtybuy);
var response = new { type = "PARTLIST_SAVE_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "PARTLIST_DELETE":
{
int idx = json.idx ?? 0;
string result = _bridge.PartList_Delete(idx);
var response = new { type = "PARTLIST_DELETE_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
// ===== Customs API (업체정보) =====
case "CUSTOMS_GET_LIST":
{
@@ -1012,6 +1201,43 @@ namespace Project.Web
}
break;
// ===== HolidayRequest API (휴가/외출 신청) =====
case "HOLIDAY_REQUEST_GET_LIST":
{
string startDate = json.startDate ?? "";
string endDate = json.endDate ?? "";
string userId = json.userId ?? "";
int userLevel = json.userLevel ?? 0;
string result = _bridge.HolidayRequest_GetList(startDate, endDate, userId, userLevel);
var response = new { type = "HOLIDAY_REQUEST_LIST_DATA", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "HOLIDAY_REQUEST_SAVE":
{
int idx = json.idx ?? 0;
string uid = json.uid ?? "";
string cate = json.cate ?? "";
string sdate = json.sdate ?? "";
string edate = json.edate ?? "";
string remark = json.remark ?? "";
string responseMsg = json.response ?? "";
int conf = json.conf ?? 0;
string holyReason = json.holyReason ?? "";
string holyBackup = json.holyBackup ?? "";
string holyLocation = json.holyLocation ?? "";
decimal holyDays = json.holyDays ?? 0;
decimal holyTimes = json.holyTimes ?? 0;
string stime = json.stime ?? "";
string etime = json.etime ?? "";
string result = _bridge.HolidayRequest_Save(idx, uid, cate, sdate, edate, remark, responseMsg, conf, holyReason, holyBackup, holyLocation, holyDays, holyTimes, stime, etime);
var response = new { type = "HOLIDAY_REQUEST_SAVED", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
// ===== MailForm API (메일양식) =====
case "MAILFORM_GET_LIST":
{
@@ -1273,6 +1499,19 @@ namespace Project.Web
}
break;
case "PROJECT_SAVE_HISTORY":
{
int idx = json.idx ?? 0;
int pidx = json.pidx ?? 0;
string pdate = json.pdate ?? "";
int progress = json.progress ?? 0;
string remark = json.remark ?? "";
string result = _bridge.Project_SaveHistory(idx, pidx, pdate, progress, remark);
var response = new { type = "PROJECT_SAVE_HISTORY_RESULT", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "PROJECT_GET_DAILY_MEMO":
{
int projectIdx = json.projectIdx ?? 0;

View File

@@ -3,26 +3,16 @@
<configSections>
</configSections>
<connectionStrings>
<add name="Project.Properties.Settings.gwcs" connectionString="Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&amp;DJ+ug-D;Encrypt=False;TrustServerCertificate=True"
providerName="System.Data.SqlClient" />
<add name="EEEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True"
providerName="System.Data.EntityClient" />
<add name="EEEntities1" connectionString="metadata=res://*/ModelMain.csdl|res://*/ModelMain.ssdl|res://*/ModelMain.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;connect timeout=30;encrypt=False;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
providerName="System.Data.EntityClient" />
<add name="EEEntitiesMain" connectionString="metadata=res://*/AdoNetEFMain.csdl|res://*/AdoNetEFMain.ssdl|res://*/AdoNetEFMain.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;connect timeout=30;encrypt=False;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
providerName="System.Data.EntityClient" />
<add name="S1ACCESS300Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=10.141.18.50;initial catalog=S1ACCESS300;persist security info=True;user id=amkoruser;password=AmkorUser!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True"
providerName="System.Data.EntityClient" />
<add name="EEEntitiesPurchase" connectionString="metadata=res://*/ModelPurchase.csdl|res://*/ModelPurchase.ssdl|res://*/ModelPurchase.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True"
providerName="System.Data.EntityClient" />
<add name="EEEntitiesCommon" connectionString="metadata=res://*/ModelCommon.csdl|res://*/ModelCommon.ssdl|res://*/ModelCommon.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True"
providerName="System.Data.EntityClient" />
<add name="EEEntitiesJobreport" connectionString="metadata=res://*/ModelJobreport.csdl|res://*/ModelJobreport.ssdl|res://*/ModelJobreport.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True"
providerName="System.Data.EntityClient" />
<add name="EEEntitiesProject" connectionString="metadata=res://*/ModelProject.csdl|res://*/ModelProject.ssdl|res://*/ModelProject.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True"
providerName="System.Data.EntityClient" />
<add name="Project.Properties.Settings.CS" connectionString="Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&amp;DJ+ug-D;Encrypt=False;TrustServerCertificate=True"
providerName="System.Data.SqlClient" />
<add name="Project.Properties.Settings.gwcs" connectionString="Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&amp;DJ+ug-D;Encrypt=False;TrustServerCertificate=True" providerName="System.Data.SqlClient" />
<add name="EEEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True" providerName="System.Data.EntityClient" />
<add name="EEEntities1" connectionString="metadata=res://*/ModelMain.csdl|res://*/ModelMain.ssdl|res://*/ModelMain.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;connect timeout=30;encrypt=False;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
<add name="EEEntitiesMain" connectionString="metadata=res://*/AdoNetEFMain.csdl|res://*/AdoNetEFMain.ssdl|res://*/AdoNetEFMain.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;connect timeout=30;encrypt=False;trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
<add name="S1ACCESS300Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=10.141.18.50;initial catalog=S1ACCESS300;persist security info=True;user id=amkoruser;password=AmkorUser!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True" providerName="System.Data.EntityClient" />
<add name="EEEntitiesPurchase" connectionString="metadata=res://*/ModelPurchase.csdl|res://*/ModelPurchase.ssdl|res://*/ModelPurchase.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True" providerName="System.Data.EntityClient" />
<add name="EEEntitiesCommon" connectionString="metadata=res://*/ModelCommon.csdl|res://*/ModelCommon.ssdl|res://*/ModelCommon.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True" providerName="System.Data.EntityClient" />
<add name="EEEntitiesJobreport" connectionString="metadata=res://*/ModelJobreport.csdl|res://*/ModelJobreport.ssdl|res://*/ModelJobreport.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True" providerName="System.Data.EntityClient" />
<add name="EEEntitiesProject" connectionString="metadata=res://*/ModelProject.csdl|res://*/ModelProject.ssdl|res://*/ModelProject.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=K4FASQL.kr.ds.amkor.com,50150;initial catalog=EE;persist security info=True;user id=eeadm;password=uJnU8a8q&amp;DJ+ug-D!;MultipleActiveResultSets=True;App=EntityFramework&quot;TrustServerCertificate=True" providerName="System.Data.EntityClient" />
<add name="Project.Properties.Settings.CS" connectionString="Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&amp;DJ+ug-D;Encrypt=False;TrustServerCertificate=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -4,29 +4,28 @@
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
</autogenerated>-->
<DiagramLayout xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ex:showrelationlabel="False" ViewPortX="137" ViewPortY="22" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="137" ViewPortY="32" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
<Shapes>
<Shape ID="DesignTable:Users" ZOrder="13" X="997" Y="61" Height="381" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Projects" ZOrder="11" X="208" Y="1" Height="286" Width="191" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
<Shape ID="DesignTable:Items" ZOrder="12" X="74" Y="218" Height="267" Width="177" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
<Shape ID="DesignTable:Users" ZOrder="12" X="997" Y="61" Height="381" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Projects" ZOrder="10" X="208" Y="1" Height="286" Width="191" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
<Shape ID="DesignTable:Items" ZOrder="11" X="74" Y="218" Height="267" Width="177" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
<Shape ID="DesignTable:Inventory" ZOrder="2" X="643" Y="66" Height="324" Width="234" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:LineCode" ZOrder="3" X="586" Y="429" Height="267" Width="199" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
<Shape ID="DesignTable:UserGroup" ZOrder="4" X="430" Y="385" Height="229" Width="208" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="178" />
<Shape ID="DesignTable:EETGW_GroupUser" ZOrder="8" X="12" Y="283" Height="324" Width="255" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
<Shape ID="DesignTable:vGroupUser" ZOrder="14" X="938" Y="-5" Height="343" Width="227" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:JobReport" ZOrder="9" X="1243" Y="724" Height="400" Width="292" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:MailData" ZOrder="6" X="434" Y="28" Height="381" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:MailAuto" ZOrder="7" X="799" Y="334" Height="324" Width="208" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
<Shape ID="DesignTable:BoardFAQ" ZOrder="5" X="403" Y="247" Height="305" Width="204" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:EETGW_LoginInfo" ZOrder="15" X="1152" Y="566" Height="210" Width="248" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="159" />
<Shape ID="DesignTable:EETGW_GroupUser" ZOrder="7" X="12" Y="283" Height="324" Width="255" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
<Shape ID="DesignTable:vGroupUser" ZOrder="13" X="938" Y="-5" Height="343" Width="227" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:JobReport" ZOrder="8" X="1243" Y="724" Height="400" Width="292" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:MailData" ZOrder="5" X="434" Y="28" Height="381" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:MailAuto" ZOrder="6" X="799" Y="334" Height="324" Width="208" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
<Shape ID="DesignTable:EETGW_LoginInfo" ZOrder="14" X="1152" Y="566" Height="210" Width="248" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="159" />
<Shape ID="DesignTable:EETGW_JobReport_AutoInput" ZOrder="1" X="1184" Y="520" Height="324" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Purchase" ZOrder="16" X="1327" Y="944" Height="305" Width="197" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:vPurchase" ZOrder="21" X="1237" Y="1036" Height="324" Width="204" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:HolidayLIst" ZOrder="20" X="1218" Y="991" Height="191" Width="210" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
<Shape ID="DesignTable:vFindSID" ZOrder="19" X="1538" Y="959" Height="305" Width="196" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:vJobReportForUser" ZOrder="18" X="1531" Y="972" Height="343" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Customs" ZOrder="17" X="1362" Y="291" Height="305" Width="195" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignSources:QueriesTableAdapter" ZOrder="10" X="673" Y="84" Height="68" Width="218" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="64" />
<Shape ID="DesignTable:Purchase" ZOrder="15" X="1327" Y="944" Height="305" Width="197" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:vPurchase" ZOrder="20" X="1237" Y="1036" Height="324" Width="204" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:HolidayLIst" ZOrder="19" X="1218" Y="991" Height="191" Width="210" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
<Shape ID="DesignTable:vFindSID" ZOrder="18" X="1538" Y="959" Height="305" Width="196" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:vJobReportForUser" ZOrder="17" X="1531" Y="972" Height="343" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Customs" ZOrder="16" X="1362" Y="291" Height="305" Width="195" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignSources:QueriesTableAdapter" ZOrder="9" X="673" Y="84" Height="68" Width="218" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="64" />
</Shapes>
<Connectors />
</DiagramLayout>

File diff suppressed because it is too large Load Diff

View File

@@ -78,9 +78,6 @@
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mn_jago = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -103,23 +100,6 @@
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.personalInventoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mn_docu = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator();
this.ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
this.minutesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.requestITemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.freeBoardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.bugReportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.todoListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripSeparator();
this.webview2TestToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.btDev = new System.Windows.Forms.ToolStripMenuItem();
this.purchaseImportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -133,17 +113,11 @@
this.addSIdDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mailBackupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.sPR설정ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem();
@@ -246,12 +220,8 @@
this.btSetting,
this.commonToolStripMenuItem,
this.managementToolStripMenuItem,
this.mn_docu,
this.ToolStripMenuItem,
this.ToolStripMenuItem,
this.btDev,
this.ToolStripMenuItem,
this.ToolStripMenuItem});
this.btDev});
this.menuStrip1.Location = new System.Drawing.Point(1, 1);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.Size = new System.Drawing.Size(1094, 27);
@@ -315,7 +285,7 @@
//
this.userAccountToolStripMenuItem.ForeColor = System.Drawing.Color.Blue;
this.userAccountToolStripMenuItem.Name = "userAccountToolStripMenuItem";
this.userAccountToolStripMenuItem.Size = new System.Drawing.Size(152, 24);
this.userAccountToolStripMenuItem.Size = new System.Drawing.Size(134, 24);
this.userAccountToolStripMenuItem.Text = "계정정보";
this.userAccountToolStripMenuItem.Click += new System.EventHandler(this.userAccountToolStripMenuItem_Click);
//
@@ -323,7 +293,7 @@
//
this.myAccouserToolStripMenuItem.ForeColor = System.Drawing.Color.Blue;
this.myAccouserToolStripMenuItem.Name = "myAccouserToolStripMenuItem";
this.myAccouserToolStripMenuItem.Size = new System.Drawing.Size(152, 24);
this.myAccouserToolStripMenuItem.Size = new System.Drawing.Size(134, 24);
this.myAccouserToolStripMenuItem.Text = "계정목록";
this.myAccouserToolStripMenuItem.Click += new System.EventHandler(this.myAccouserToolStripMenuItem_Click);
//
@@ -331,7 +301,7 @@
//
this.ToolStripMenuItem.ForeColor = System.Drawing.Color.Blue;
this.ToolStripMenuItem.Name = "권한설정ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(152, 24);
this.ToolStripMenuItem.Size = new System.Drawing.Size(134, 24);
this.ToolStripMenuItem.Text = "권한설정";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
@@ -339,13 +309,13 @@
//
this.toolStripMenuItem12.ForeColor = System.Drawing.Color.Blue;
this.toolStripMenuItem12.Name = "toolStripMenuItem12";
this.toolStripMenuItem12.Size = new System.Drawing.Size(149, 6);
this.toolStripMenuItem12.Size = new System.Drawing.Size(131, 6);
//
// 그룹정보ToolStripMenuItem
//
this.ToolStripMenuItem.ForeColor = System.Drawing.Color.Blue;
this.ToolStripMenuItem.Name = "그룹정보ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(152, 24);
this.ToolStripMenuItem.Size = new System.Drawing.Size(134, 24);
this.ToolStripMenuItem.Text = "그룹정보";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
@@ -378,9 +348,6 @@
this.mn_purchase,
this.mn_project,
this.mn_dailyhistory,
this.ToolStripMenuItem,
this.ToolStripMenuItem,
this.ToolStripMenuItem,
this.ToolStripMenuItem,
this.mn_jago,
this.ToolStripMenuItem,
@@ -519,7 +486,6 @@
this.mn_dailyhistory.Name = "mn_dailyhistory";
this.mn_dailyhistory.Size = new System.Drawing.Size(203, 24);
this.mn_dailyhistory.Text = "업무관리";
this.mn_dailyhistory.Click += new System.EventHandler(this.ToolStripMenuItem1_Click);
//
// 목록ToolStripMenuItem1
//
@@ -559,31 +525,6 @@
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
this.toolStripMenuItem2.Size = new System.Drawing.Size(231, 6);
//
// 업무현황전자실ToolStripMenuItem
//
this.ToolStripMenuItem.ForeColor = System.Drawing.Color.Red;
this.ToolStripMenuItem.Name = "업무현황전자실ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(203, 24);
this.ToolStripMenuItem.Text = "업무현황(전자실)";
this.ToolStripMenuItem.Visible = false;
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 교육목록ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "교육목록ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(203, 24);
this.ToolStripMenuItem.Text = "교육목록";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 비용절감ToolStripMenuItem
//
this.ToolStripMenuItem.ForeColor = System.Drawing.Color.Black;
this.ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("비용절감ToolStripMenuItem.Image")));
this.ToolStripMenuItem.Name = "비용절감ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(203, 24);
this.ToolStripMenuItem.Text = "비용절감";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 라이선스ToolStripMenuItem
//
this.ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("라이선스ToolStripMenuItem.Image")));
@@ -760,146 +701,6 @@
this.personalInventoryToolStripMenuItem.Visible = false;
this.personalInventoryToolStripMenuItem.Click += new System.EventHandler(this.personalInventoryToolStripMenuItem_Click);
//
// mn_docu
//
this.mn_docu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripMenuItem,
this.toolStripMenuItem4,
this.ToolStripMenuItem1,
this.ToolStripMenuItem,
this.toolStripMenuItem3,
this.minutesToolStripMenuItem,
this.requestITemToolStripMenuItem,
this.freeBoardToolStripMenuItem,
this.bugReportToolStripMenuItem,
this.todoListToolStripMenuItem,
this.ToolStripMenuItem});
this.mn_docu.Image = ((System.Drawing.Image)(resources.GetObject("mn_docu.Image")));
this.mn_docu.Name = "mn_docu";
this.mn_docu.Size = new System.Drawing.Size(65, 23);
this.mn_docu.Text = "문서";
//
// 메모장ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "메모장ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
this.ToolStripMenuItem.Text = "메모장";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// toolStripMenuItem4
//
this.toolStripMenuItem4.Name = "toolStripMenuItem4";
this.toolStripMenuItem4.Size = new System.Drawing.Size(146, 6);
//
// 패치내역ToolStripMenuItem1
//
this.ToolStripMenuItem1.Name = "패치내역ToolStripMenuItem1";
this.ToolStripMenuItem1.Size = new System.Drawing.Size(149, 24);
this.ToolStripMenuItem1.Text = "패치 내역";
this.ToolStripMenuItem1.Click += new System.EventHandler(this.ToolStripMenuItem1_Click);
//
// 메일내역ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "메일내역ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
this.ToolStripMenuItem.Text = "메일 내역";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// toolStripMenuItem3
//
this.toolStripMenuItem3.Name = "toolStripMenuItem3";
this.toolStripMenuItem3.Size = new System.Drawing.Size(146, 6);
//
// minutesToolStripMenuItem
//
this.minutesToolStripMenuItem.ForeColor = System.Drawing.Color.HotPink;
this.minutesToolStripMenuItem.Name = "minutesToolStripMenuItem";
this.minutesToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
this.minutesToolStripMenuItem.Text = "회의록";
this.minutesToolStripMenuItem.Visible = false;
this.minutesToolStripMenuItem.Click += new System.EventHandler(this.minutesToolStripMenuItem_Click);
//
// requestITemToolStripMenuItem
//
this.requestITemToolStripMenuItem.ForeColor = System.Drawing.Color.HotPink;
this.requestITemToolStripMenuItem.Name = "requestITemToolStripMenuItem";
this.requestITemToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
this.requestITemToolStripMenuItem.Text = "견적요청";
this.requestITemToolStripMenuItem.Visible = false;
this.requestITemToolStripMenuItem.Click += new System.EventHandler(this.requestITemToolStripMenuItem_Click);
//
// freeBoardToolStripMenuItem
//
this.freeBoardToolStripMenuItem.Enabled = false;
this.freeBoardToolStripMenuItem.Name = "freeBoardToolStripMenuItem";
this.freeBoardToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
this.freeBoardToolStripMenuItem.Text = "Free Board";
this.freeBoardToolStripMenuItem.Visible = false;
//
// bugReportToolStripMenuItem
//
this.bugReportToolStripMenuItem.Enabled = false;
this.bugReportToolStripMenuItem.Name = "bugReportToolStripMenuItem";
this.bugReportToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
this.bugReportToolStripMenuItem.Text = "Bug Report";
this.bugReportToolStripMenuItem.Visible = false;
//
// todoListToolStripMenuItem
//
this.todoListToolStripMenuItem.Enabled = false;
this.todoListToolStripMenuItem.Name = "todoListToolStripMenuItem";
this.todoListToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
this.todoListToolStripMenuItem.Text = "Todo List";
this.todoListToolStripMenuItem.Visible = false;
this.todoListToolStripMenuItem.Click += new System.EventHandler(this.todoListToolStripMenuItem_Click);
//
// 메일전송ToolStripMenuItem
//
this.ToolStripMenuItem.ForeColor = System.Drawing.Color.Red;
this.ToolStripMenuItem.Name = "메일전송ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(149, 24);
this.ToolStripMenuItem.Text = "메일전송";
this.ToolStripMenuItem.Visible = false;
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 기타ToolStripMenuItem
//
this.ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripMenuItem,
this.ToolStripMenuItem,
this.toolStripMenuItem17,
this.webview2TestToolStripMenuItem});
this.ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("기타ToolStripMenuItem.Image")));
this.ToolStripMenuItem.Name = "기타ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(65, 23);
this.ToolStripMenuItem.Text = "기타";
//
// 품목검색ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "품목검색ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(171, 24);
this.ToolStripMenuItem.Text = "품목 검색";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 대쉬보드ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "대쉬보드ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(171, 24);
this.ToolStripMenuItem.Text = "대쉬보드";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// toolStripMenuItem17
//
this.toolStripMenuItem17.Name = "toolStripMenuItem17";
this.toolStripMenuItem17.Size = new System.Drawing.Size(168, 6);
//
// webview2TestToolStripMenuItem
//
this.webview2TestToolStripMenuItem.Name = "webview2TestToolStripMenuItem";
this.webview2TestToolStripMenuItem.Size = new System.Drawing.Size(171, 24);
this.webview2TestToolStripMenuItem.Text = "Webview2 Test";
this.webview2TestToolStripMenuItem.Click += new System.EventHandler(this.webview2TestToolStripMenuItem_Click);
//
// 즐겨찾기ToolStripMenuItem
//
this.ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("즐겨찾기ToolStripMenuItem.Image")));
@@ -921,11 +722,7 @@
this.addSIdDataToolStripMenuItem,
this.ToolStripMenuItem,
this.ToolStripMenuItem1,
this.toolStripMenuItem1,
this.ToolStripMenuItem,
this.mailBackupToolStripMenuItem,
this.ToolStripMenuItem,
this.toolStripMenuItem5,
this.ToolStripMenuItem,
this.sPR설정ToolStripMenuItem,
this.toolStripMenuItem13,
@@ -1014,21 +811,6 @@
this.ToolStripMenuItem1.Text = "그룹정보";
this.ToolStripMenuItem1.Click += new System.EventHandler(this.ToolStripMenuItem1_Click);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.ForeColor = System.Drawing.Color.HotPink;
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(302, 24);
this.toolStripMenuItem1.Text = "Staff Grid";
this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click);
//
// 임의테이블조작ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "임의테이블조작ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(302, 24);
this.ToolStripMenuItem.Text = "구매내역 suuply 다시 설정 하기";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// mailBackupToolStripMenuItem
//
this.mailBackupToolStripMenuItem.Name = "mailBackupToolStripMenuItem";
@@ -1036,18 +818,6 @@
this.mailBackupToolStripMenuItem.Text = "Mail Backup";
this.mailBackupToolStripMenuItem.Click += new System.EventHandler(this.mailBackupToolStripMenuItem_Click);
//
// 메일자동발신테스트ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "메일자동발신테스트ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(302, 24);
this.ToolStripMenuItem.Text = "메일자동발신(테스트)";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// toolStripMenuItem5
//
this.toolStripMenuItem5.Name = "toolStripMenuItem5";
this.toolStripMenuItem5.Size = new System.Drawing.Size(299, 6);
//
// 아이템비활성화하기ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "아이템비활성화하기ToolStripMenuItem";
@@ -1076,22 +846,6 @@
this.ToolStripMenuItem.Text = "프로젝트스케쥴담당자사번업데이트";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 버젼확인ToolStripMenuItem
//
this.ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("버젼확인ToolStripMenuItem.Image")));
this.ToolStripMenuItem.Name = "버젼확인ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(93, 23);
this.ToolStripMenuItem.Text = "버젼확인";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 설명서ToolStripMenuItem
//
this.ToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("설명서ToolStripMenuItem.Image")));
this.ToolStripMenuItem.Name = "설명서ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(79, 23);
this.ToolStripMenuItem.Text = "설명서";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// tabControl1
//
this.tabControl1.Appearance = System.Windows.Forms.TabAppearance.FlatButtons;
@@ -1244,15 +998,9 @@
private System.Windows.Forms.ToolStripMenuItem itemsToolStripMenuItem;
private System.Windows.Forms.ToolStripStatusLabel sbLogin;
private System.Windows.Forms.ToolStripMenuItem codesToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mn_docu;
private System.Windows.Forms.ToolStripMenuItem freeBoardToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem bugReportToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem todoListToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem managementToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem personalInventoryToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem userInfoToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem minutesToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem requestITemToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mn_purchase;
private System.Windows.Forms.ToolStripMenuItem btDev;
private System.Windows.Forms.ToolStripMenuItem purchaseImportToolStripMenuItem;
@@ -1267,9 +1015,7 @@
private System.Windows.Forms.ToolStripMenuItem mn_project;
private System.Windows.Forms.ToolStripMenuItem projectImportCompleteToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem purchaseOrderImportToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mn_dailyhistory;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem workReportImportToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mn_kuntae;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
@@ -1280,14 +1026,8 @@
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3;
private System.Windows.Forms.ToolStripMenuItem mailBackupToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem6;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7;
@@ -1296,33 +1036,24 @@
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripStatusLabel lbSvr;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripButton toolStripButton1;
private System.Windows.Forms.ToolStripButton toolStripButton2;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem layoutToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem9;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem10;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem5;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem11;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem sPR설정ToolStripMenuItem;
@@ -1341,7 +1072,6 @@
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem15;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripStatusLabel sbLoginUseTime;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem16;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
@@ -1350,8 +1080,6 @@
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem NRCR기준금액입력ToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem17;
private System.Windows.Forms.ToolStripMenuItem webview2TestToolStripMenuItem;
private System.Windows.Forms.ToolStripStatusLabel sbWeb;
private System.Windows.Forms.ToolStripStatusLabel sbChat;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem18;

View File

@@ -164,8 +164,8 @@ namespace Project
// WebView2 로그인의 경우 OnLoginCompleted()에서 호출됨
//if (Pub.InitWebView != 1)
//{
Menu_Dashboard();
//OnLoginCompleted();
Menu_Dashboard();
//OnLoginCompleted();
//}
}
@@ -183,8 +183,6 @@ namespace Project
this.mn_jago.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_jago);
//this.mn_eq.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_equipment);
this.mn_kuntae.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_workday);
this.mn_docu.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_docu);
//this.mn_logdata.Visible = FCOMMON.Util.getBit(FCOMMON.info.Login.gpermission, (int)FCOMMON.eGroupPermission.menu_logdata);
//220421
FCOMMON.info.Disable_8hourover = Pub.setting.Disable8HourOver;
@@ -377,12 +375,7 @@ namespace Project
}
void menu_save_cost()
{
string formkey = "SAVECOST";
if (!ShowForm(formkey))
AddForm(formkey, new FPJ0000.fSaveCostList());
}
void menu_dayhistory()
{
@@ -459,27 +452,10 @@ namespace Project
private void codesToolStripMenuItem_Click(object sender, EventArgs e)
{
//if (Pub.InitWebView > 0 && System.Diagnostics.Debugger.IsAttached)
//{
// var f = new Dialog.fCommon();
// f.ShowDialog();
//}
//else
{
var f = new FCM0000.fCode();
f.ShowDialog();
}
var f = new FCM0000.fCode();
f.ShowDialog();
}
private void requestITemToolStripMenuItem_Click(object sender, EventArgs e)
{
string formkey = "ITEMREQUEST";
if (!ShowForm(formkey))
AddForm(formkey, new FCM0000.fRequestItem());
}
void menu_itemin()
{
string formkey = "ITEMIPKO";
@@ -697,28 +673,6 @@ namespace Project
Menu_Dashboard();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (FCOMMON.info.Login.level < 10)
{
FCOMMON.Util.MsgE("테스트 기능이므로 개발자만 사용가능 합니다.");
return;
}
FCM0000.fSendMail f = new FCM0000.fSendMail();
//f.MdiParent = this;
f.Show();
}
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
{
}
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
{
FCM0000.fPatchList f = new FCM0000.fPatchList();
f.Show();
}
private void workReportImportToolStripMenuItem_Click(object sender, EventArgs e)
{
@@ -823,12 +777,7 @@ namespace Project
if (!ShowForm(formkey))
AddForm(formkey, new FCM0000.fInventoryJagoList());
}
void Menu_Note()
{
string formkey = "NOTELIST";
if (!ShowForm(formkey))
AddForm(formkey, new FPJ0000.Note.fNote());
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
Menu_InventoryList();
@@ -930,11 +879,6 @@ namespace Project
FCOMMON.Util.MsgI("complete");
}
private void sMTRepairLogToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
string formkey = "MAILFORM";
@@ -942,20 +886,6 @@ namespace Project
AddForm(formkey, new FCM0000.fMailform());
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
string formkey = "MAILLIST";
if (!ShowForm(formkey))
AddForm(formkey, new FCM0000.Mail.fMailList());
}
private void pMP데이터베이스업데이트ToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void mailBackupToolStripMenuItem_Click(object sender, EventArgs e)
{
var f = new FCM0000.Mail.fMailBackup();
@@ -963,11 +893,6 @@ namespace Project
f.Show();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
Menu_Note();
}
private void toolStripMenuItem7_Click(object sender, EventArgs e)
{
@@ -998,10 +923,6 @@ namespace Project
AddForm(formkey, new FBS0000.fWorkTableUser());
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
menu_save_cost();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
@@ -1026,15 +947,6 @@ namespace Project
menu_work_reportautoinput();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
//업무현황 전자실
Util.MsgE("자스민 이용하세요!!");
string formkey = "EBOARD";
if (!ShowForm(formkey))
AddForm(formkey, new FPJ0000.fEboardList(), "ALL");
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
@@ -1049,12 +961,6 @@ namespace Project
AddForm(formkey, new FPJ0000.fProjectLayout());
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
string formkey = "EDLIST";
if (!ShowForm(formkey))
AddForm(formkey, new FED0000.fEdulist());
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
@@ -1063,16 +969,6 @@ namespace Project
AddForm(formkey, new FCM0000.fJRForm());
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 로컬 PDF 파일 열기
var pdfPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Manual.pdf");
if (System.IO.File.Exists(pdfPath))
Util.RunExplorer(pdfPath);
else
Util.MsgE("설명서 파일을 찾을 수 없습니다.");
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
string formkey = "LICENSE";
@@ -1139,7 +1035,7 @@ namespace Project
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
var uid = FCOMMON.info.Login.nameK + "(" + FCOMMON.info.Login.no + ")";
var f = new FBS0000.fHolyDayData(DateTime.Now.ToShortDateString(), uid);
var f = new FBS0000.fHolyDayData(DateTime.Now.ToString("yyyy-MM-dd"), uid);
f.Show();
}
@@ -1461,7 +1357,7 @@ namespace Project
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
var uid = FCOMMON.info.Login.nameK + "(" + FCOMMON.info.Login.no + ")";
var f = new FBS0000.fHolyDayDataSum(DateTime.Now.ToShortDateString(), uid);
var f = new FBS0000.fHolyDayDataSum(DateTime.Now.ToString("yyyy-MM-dd"), uid);
f.Show();
}

View File

@@ -141,26 +141,6 @@
0IOABBs4KBjggQGBjQM9XoQwIYIHBB4yUpjo8AFLBS9fKjAgYSJCAQEyeJAgIUAEnj4RAgjgQUPPCgwQ
9Ey51APJABUIYKAwoADNBBlfRrCwtUOGBT49JEhAwIAFABQaFEDb0cMBAwg0DECbtOGFAoD7GlQomCHD
gAA7
</value>
</data>
<data name="codesToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
R0lGODlhEAAQAIQAAHan1azQ4ldvj9vp9HSQruTr80lVa+vx9pu811SRuXifuj13uYyz2VFhe4Gt2UNL
XPL1+Orv+ufu9YOqxYyzzNHW3SkxQz5FVWag2T6CuZe3y5G0t+Do7+r0/77a9f///yH/C05FVFNDQVBF
Mi4wAwEBAAAh+QQAAAAAACwAAAAAEAAQAAAIrwA/CBxIsKDAAQESIkBAYYICBQQICCAgMMAACQMyaswo
oUKDih0SZMiwoKTJBQcEVDyAoEMHDy5hdnAg4eMHBBIQeNjJcyeDAjYRRNAQs+hMoAIpRNjQs6eDAgYE
TshpVCYAqAIV5GzKU0GBB1klMKjqEgMHsB8IiOW60+wFgQQgIGDgoC4AABgwADjw9oOAChAkSChAmIPh
AxUswBXAuEEDAwYePLhwwYJNg5gFBgQAOw==
</value>
</data>
<data name="메일양식ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
R0lGODlhEAAQAIQfAHWSrbTY+6nU/I+74/r8/drj7FlxkUlVa9Xp/eLs9cvT2oWpxG+bwqPQ+57N++v1
/lJgeabK7JnB5kNLXJG0z5nA1oyw0SkxQz5FVb7e/aC91tHl8qXB2n2gu////////yH/C05FVFNDQVBF
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIpAA/CBxIsKDBgwQ9KFzIsKHCDRUqUFhAsQOAiwAMQFBY
gYDHjyAJKNjogQIBChoQZAgQAEGCiQUOKFxAIEMEDhsQPEDAQEKDBzI9dKiZIYOFowwENPg5QeHQlRIi
SJAwYIADBwWaegCQIMAACQEEKK2KFYNCrgMihBXbwEHVBGY9GFCQIEGBu3jvKrhw1oBfCBAOHJgwAQOG
CyQdKlaIsLHjggEBADs=
</value>
</data>
<data name="commonToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -283,26 +263,6 @@
Mi4wAwEBAAAh+QQBAAAQACwAAAAAEAAQAAAIZQAhCBxIsKBABgQBGCTIoCEEBgEWDmRAgMAAAwUgKJQ4
QIEDBwciSmw4QMDHBRIBBCiQAIGABw8aSBSosgHMmCkH2oQpc6bAnTh9QgDa0ydRoUMffCw6s4FJB0wl
OoWKdGiDBgEBADs=
</value>
</data>
<data name="mn_docu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
R0lGODlhEAAQAIQfAJrM+3OSsKfS++zx9uXt9Yis1FdwkZW51ElVa8fj/bba/NXb5PL2+o276b3d/VJh
e7TR4ENLXNXn8KLD536kwIyzzJ/E2KjL3t7n7ykxQz5FVa/W/OLp8I+w1P///////yH/C05FVFNDQVBF
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAItgA9CBxIcOCHgx4kQIBwwcKBChQiBgjgASEECQQGZNRI
oGMDAxU9QCCQoGRJBygZNPgo8AKDBB1iyuzAoOYDgRZeonSgoGfPDQxuejjwcsLMAkgFBBVY4aVPBRui
ClCKQCCFojGRIm0ggEBVDxQG8IQqdSoAAhGsijWqdSsADmk9BBBLdqoAAHgxaBAYgAHPsnjxDtjrwcAC
Bhw5KOaAYQCEDHwNSH7wAAGCCBE0aMggtKBnggEBADs=
</value>
</data>
<data name="기타ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
R0lGODlhEAAQAIQfAKnrVsfvlYnVOHy8KnfJLJneRWqyJLvth1W7GzGTEVWnHT2aFIPNMkuiGmrKJGKt
Io7eOXa5KU64GDiWE1yqIHK3KHa5J0WeGGC/IG+1JW/FKGjCJHnRLWrOIP///////yH/C05FVFNDQVBF
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIqwA/CBTooeDAgwg9DFjoAWHCAQEAFBjQ0CHBAQAEFLBQ
8WDBjxEARPjY8YPChREiZshg4EFJhQFiFmBQAAIECh8vLoTAgAEBAgIUeGhwoaHCghUE/NTAgcCFAxAW
GDWZQamGDRgwIEAgYUJBjh4MCODAAYODBRMkSEhQMAJLARQUNODgwGsCtiYjHBDgsuCCDl4NmqxQAK7R
v3gHemD5QK4HtBMSEyRplOTBgAA7
</value>
</data>
<data name="즐겨찾기ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -324,24 +284,24 @@
vQU5DIar2KFgxYEHBgQAOw==
</value>
</data>
<data name="버젼확인ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="codesToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
R0lGODlhEAAQAIQfAGm6/idTd4yTmF+v8Xa37KvW+lyh3KHJ62aq41ee2bXZ98nm/2mt5W2Ck5XN/C1c
hEZieho8WXXA/2Gn4P39/W+y6V+l3qjP8Njt/lx2izxPYGyv51Oa1EJWZ////////yH/C05FVFNDQVBF
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIqgA/CPzgoaBBDwMTEoQgoGGDBhAQKvSQAcOCBQUcaHwg
USBFDARCEqhQgYEEjh47gKxwweAFBAgkREDooYMCAhs8XGCAwMOEmB1o2qywYSdMnxMABCVocwMDngUP
GLAAYCZTBTARHPAgdWpVoQV+TrBgoGwCA1+ZOkgwduuBBAk4pCWogUBcDnjxAgjQkS4BAAMCD9jrgcJE
DQ8eBAjwYKZhhQQPFoRMuXJAADs=
R0lGODlhEAAQAIQAAHan1azQ4ldvj9vp9HSQruTr80lVa+vx9pu811SRuXifuj13uYyz2VFhe4Gt2UNL
XPL1+Orv+ufu9YOqxYyzzNHW3SkxQz5FVWag2T6CuZe3y5G0t+Do7+r0/77a9f///yH/C05FVFNDQVBF
Mi4wAwEBAAAh+QQAAAAAACwAAAAAEAAQAAAIrwA/CBxIsKDAAQESIkBAYYICBQQICCAgMMAACQMyaswo
oUKDih0SZMiwoKTJBQcEVDyAoEMHDy5hdnAg4eMHBBIQeNjJcyeDAjYRRNAQs+hMoAIpRNjQs6eDAgYE
TshpVCYAqAIV5GzKU0GBB1klMKjqEgMHsB8IiOW60+wFgQQgIGDgoC4AABgwADjw9oOAChAkSChAmIPh
AxUswBXAuEEDAwYePLhwwYJNg5gFBgQAOw==
</value>
</data>
<data name="설명서ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="메일양식ToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
R0lGODlhEAAQAIQAAP/99v/qaOvOSem4M+zSSv/ypf/ug//1w//2zP/xnv/te//zrf/0uv/41/nWdufB
MP/vkevTVf/rcv/0s//wlv/57OvRM//vi+/OQtaXIuuYEuvTLNyhJ+vHUP///////yH/C05FVFNDQVBF
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIoAA/CBxIsCBBDwgTKizogUCEhwQIYLBgYYOHgR4cKPQA
oMEBBAgsfsjoAQGDCQsKJEhAAcKBChYQajyZkiWECwYMAHiAkAAAlCop4FRA9ABPDxgqABVqQIGEpxQG
IMTQoCaEphICaFXAAaEABCmZZtUawECGi0gRHGigloFWCgzOYhRAt0OHASg1yD24cUAFDRcNMhwAWLBB
D4UNMwz8ISAAOw==
R0lGODlhEAAQAIQfAHWSrbTY+6nU/I+74/r8/drj7FlxkUlVa9Xp/eLs9cvT2oWpxG+bwqPQ+57N++v1
/lJgeabK7JnB5kNLXJG0z5nA1oyw0SkxQz5FVb7e/aC91tHl8qXB2n2gu////////yH/C05FVFNDQVBF
Mi4wAwEBAAAh+QQBAAAfACwAAAAAEAAQAAAIpAA/CBxIsKDBgwQ9KFzIsKHCDRUqUFhAsQOAiwAMQFBY
gYDHjyAJKNjogQIBChoQZAgQAEGCiQUOKFxAIEMEDhsQPEDAQEKDBzI9dKiZIYOFowwENPg5QeHQlRIi
SJAwYIADBwWaegCQIMAACQEEKK2KFYNCrgMihBXbwEHVBGY9GFCQIEGBu3jvKrhw1oBfCBAOHJgwAQOG
CyQdKlaIsLHjggEBADs=
</value>
</data>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@@ -445,14 +405,14 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIHSURBVDhPY2CAgZnGrAxLtTMZluosYFim08KwWFcdLL5K
i4dhmVYhwzLteQzLdFoZlqlLwfWggKU6qxmW6fyH48U6PxiWaHoyLNO8jiK+VOsJwyotCTTNWjYgSYG1
lv/9Tub8T7lc/z/3ZMX/eXNiP9S05P9LvdzwP/Jc2X/VbV5QQ7T7UA1YpjOBf435seQr9d+Kb/X8L7nZ
lv/9Tub8T7lc/z/3ZMX/eXNiP9TU5/9LvdzwP/Jc2X/VbV5QQ7T7UA1YpjOBf435seQr9d+Kb/X8L7nZ
8//QzJz/jzrT/l+dlPkTJAbDJrtDTzAs0bmGasBSXcHiW911MEUdh+r/Xy+N+L+/1f7v9UKvzz3bCuEG
FN/qugBSj2oAAwND8c3uuTBFlZc6lp0vDDl4Odnt28Ugtf/bKpz2Fl/s+AiSK7jZ8w5dLxjAXFB0s6cE
xH/RGiH+uMzz/5UMrT9Psm3UCm/26hff6vpcdKvnPLpeMCi+02NcfKPrOIz/uNjT81Gpx38wLvHyAKu5
2V1afKu7BUUjMii+0y0GYz+p8MqCGfCk0jsTJFZ/v54j99ZEPhRNuMCjCs++J+Ve/0H4cblXL7o8QfC4
zHMj3AulHhvQ5fGC//vrOV50RZ1+0xP3H4RfdkaeAomhq0MB/w70a/490Nv3/0DvmfsHen//P9D7HxlD
xc6A1ezv0UBo3DaR/e+B3vknOuv/oWvChUFq/x7omQfSy/B3f28vugJiMUgvw78DfbZ/D/Qs/3+gdxUp
GKQHpBcAJ5WqUADLneEAAAAASUVORK5CYII=
xc6A1ezv0UBo3DaR/e+B3vmHmuv/oWvChUFq/x7omQfSy/B3f28vugJiMUgvw78DfbZ/D/Qs/3+gdxUp
GKQHpBcAByWqM8i7D2wAAAAASUVORK5CYII=
</value>
</data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

View File

@@ -3,8 +3,12 @@ import { HashRouter, Routes, Route } from 'react-router-dom';
import { Layout } from '@/components/layout';
import { Dashboard, Todo, Kuntae, Jobreport, Project, Login, CommonCodePage, ItemsPage, UserListPage, MonthlyWorkPage, MailFormPage, UserAuthPage, Note } from '@/pages';
import { PatchList } from '@/pages/PatchList';
import { BugReport } from '@/pages/BugReport';
import { MailList } from '@/pages/MailList';
import { Customs } from '@/pages/Customs';
import { LicenseList } from '@/components/license/LicenseList';
import { PartList } from '@/pages/PartList';
import HolidayRequest from '@/pages/HolidayRequest';
import { comms } from '@/communication';
import { UserInfo } from '@/types';
import { Loader2 } from 'lucide-react';
@@ -87,6 +91,7 @@ export default function App() {
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/todo" element={<Todo />} />
<Route path="/kuntae" element={<Kuntae />} />
<Route path="/holiday-request" element={<HolidayRequest />} />
<Route path="/jobreport" element={<Jobreport />} />
<Route path="/project" element={<Project />} />
<Route path="/common" element={<CommonCodePage />} />
@@ -98,7 +103,10 @@ export default function App() {
<Route path="/mail-form" element={<MailFormPage />} />
<Route path="/note" element={<Note />} />
<Route path="/patch-list" element={<PatchList />} />
<Route path="/bug-report" element={<BugReport />} />
<Route path="/mail-list" element={<MailList />} />
<Route path="/license" element={<LicenseList />} />
<Route path="/partlist" element={<PartList />} />
</Route>
</Routes>
{/* Tailwind Breakpoint Indicator - 개발용 */}

View File

@@ -42,6 +42,9 @@ import type {
BoardItem,
MailItem,
CustomItem,
LicenseItem,
PartListItem,
HolidayRequest,
} from '@/types';
// WebView2 환경 감지
@@ -135,21 +138,28 @@ class CommunicationLayer {
}, 2000);
}
const requestId = Date.now().toString() + Math.random().toString(36).substr(2, 9);
const timeoutId = setTimeout(() => {
this.listeners = this.listeners.filter(cb => cb !== handler);
reject(new Error(`${requestType} timeout`));
}, 10000);
const handler = (data: unknown) => {
const msg = data as { type: string; data?: T; Success?: boolean; Message?: string };
const msg = data as { type: string; data?: T; Success?: boolean; Message?: string; requestId?: string };
if (msg.type === responseType) {
// requestId가 있는 경우 일치 여부 확인 (백엔드가 지원하는 경우)
if (msg.requestId && msg.requestId !== requestId) {
return;
}
clearTimeout(timeoutId);
this.listeners = this.listeners.filter(cb => cb !== handler);
resolve(msg.data as T);
}
};
this.listeners.push(handler);
this.ws?.send(JSON.stringify({ ...params, type: requestType }));
this.ws?.send(JSON.stringify({ ...params, type: requestType, requestId }));
});
}
@@ -464,6 +474,21 @@ class CommunicationLayer {
}
}
public async saveProjectHistory(historyData: { idx?: number; pidx: number; pdate: string; progress: number; remark: string }): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.Project_SaveHistory(
historyData.idx || 0,
historyData.pidx,
historyData.pdate,
historyData.progress,
historyData.remark
);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('PROJECT_SAVE_HISTORY', 'PROJECT_SAVE_HISTORY_RESULT', historyData);
}
}
// ===== Login API =====
@@ -899,6 +924,39 @@ class CommunicationLayer {
}
}
// ===== HolidayRequest API (휴가/외출 신청) =====
public async getHolidayRequestList(startDate: string, endDate: string, userId: string, userLevel: number): Promise<ApiResponse<HolidayRequest[]>> {
if (isWebView && machine) {
const result = await machine.HolidayRequest_GetList(startDate, endDate, userId, userLevel);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse<HolidayRequest[]>>('HOLIDAY_REQUEST_GET_LIST', 'HOLIDAY_REQUEST_LIST_DATA', { startDate, endDate, userId, userLevel });
}
}
public async saveHolidayRequest(data: HolidayRequest): Promise<ApiResponse> {
const { idx, uid, cate, sdate, edate, Remark, Response, conf, HolyReason, HolyBackup, HolyLocation, HolyDays, HolyTimes, stime, etime } = data;
const remark = Remark || '';
const response = Response || '';
const holyReason = HolyReason || '';
const holyBackup = HolyBackup || '';
const holyLocation = HolyLocation || '';
const holyDays = HolyDays || 0;
const holyTimes = HolyTimes || 0;
const sTime = stime || '';
const eTime = etime || '';
if (isWebView && machine) {
const result = await machine.HolidayRequest_Save(idx, uid, cate, sdate, edate, remark, response, conf, holyReason, holyBackup, holyLocation, holyDays, holyTimes, sTime, eTime);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('HOLIDAY_REQUEST_SAVE', 'HOLIDAY_REQUEST_SAVED', {
idx, uid, cate, sdate, edate, remark, response, conf, holyReason, holyBackup, holyLocation, holyDays, holyTimes, stime: sTime, etime: eTime
});
}
}
// ===== MailForm API (메일양식) =====
public async getMailFormList(): Promise<ApiResponse<MailFormItem[]>> {
@@ -1314,6 +1372,37 @@ class CommunicationLayer {
}
}
/**
* 게시판 댓글/답글 목록 조회
* @param rootIdx 원글 인덱스
* @returns ApiResponse<BoardItem[]>
*/
public async getBoardReplies(rootIdx: number): Promise<ApiResponse<BoardItem[]>> {
if (isWebView && machine) {
const result = await machine.Board_GetReplies(rootIdx);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse<BoardItem[]>>('BOARD_GET_REPLIES', 'BOARD_REPLIES_DATA', { rootIdx });
}
}
/**
* 게시판 댓글/답글 추가
* @param rootIdx 원글 인덱스
* @param pidx 부모 글 인덱스
* @param contents 댓글 내용
* @param isComment 댓글 타입 (true: 댓글, false: 답글)
* @returns ApiResponse
*/
public async addBoardReply(rootIdx: number, pidx: number, title: string, contents: string, isComment: boolean = true): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.Board_AddReply(rootIdx, pidx, title, contents, isComment);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('BOARD_ADD_REPLY', 'BOARD_REPLY_ADDED', { rootIdx, pidx, title, contents, isComment });
}
}
/**
* 메일 발신 내역 조회
* @param startDate 시작일 (yyyy-MM-dd)
@@ -1330,6 +1419,64 @@ class CommunicationLayer {
}
}
/**
* 메일 데이터 추가 (발송 대기열)
* @param cate 분류
* @param subject 제목
* @param fromlist 발신자
* @param tolist 수신자
* @param cc 참조
* @param bcc 숨은참조
* @param body 내용
* @returns ApiResponse
*/
public async addMailData(cate: string, subject: string, fromlist: string, tolist: string, cc: string, bcc: string, body: string): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.Mail_AddData(cate, subject, fromlist, tolist, cc, bcc, body);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('MAIL_ADD_DATA', 'MAIL_ADD_DATA_RESULT', { cate, subject, fromlist, tolist, cc, bcc, body });
}
}
/**
* 메일 직접 발송 (SMTP)
* @param cate 분류
* @param subject 제목
* @param fromlist 발신자
* @param tolist 수신자
* @param cc 참조
* @param bcc 숨은참조
* @param body 내용
* @returns ApiResponse
*/
public async sendMailDirect(cate: string, subject: string, fromlist: string, tolist: string, cc: string, bcc: string, body: string): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.Mail_SendDirect(cate, subject, fromlist, tolist, cc, bcc, body);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('MAIL_SEND_DIRECT', 'MAIL_SEND_DIRECT_RESULT', { cate, subject, fromlist, tolist, cc, bcc, body });
}
}
/**
* Outlook으로 메일 미리보기/발송
* @param subject 제목
* @param tolist 수신자
* @param cc 참조
* @param bcc 숨은참조
* @param body 내용
* @returns ApiResponse
*/
public async sendMailOutlook(subject: string, tolist: string, cc: string, bcc: string, body: string): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.Mail_SendOutlook(subject, tolist, cc, bcc, body);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('MAIL_SEND_OUTLOOK', 'MAIL_SEND_OUTLOOK_RESULT', { subject, tolist, cc, bcc, body });
}
}
/**
* 업체정보 목록 조회
* @param searchKey 검색어
@@ -1357,6 +1504,175 @@ class CommunicationLayer {
return this.wsRequest<ApiResponse<CustomItem>>('CUSTOMS_GET_DETAIL', 'CUSTOMS_DETAIL_DATA', { idx });
}
}
/**
* 라이선스 목록 조회
* @returns ApiResponse<LicenseItem[]>
*/
public async getLicenseList(): Promise<ApiResponse<LicenseItem[]>> {
if (isWebView && machine) {
const result = await machine.License_GetList();
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse<LicenseItem[]>>('LICENSE_GET_LIST', 'LICENSE_LIST_DATA', {});
}
}
/**
* 라이선스 추가
*/
public async addLicense(
name: string,
version: string,
meterialNo: string,
supply: string,
qty: number,
uids: string,
serialNo: string,
remark: string,
sdate: string,
edate: string,
manu: string,
expire: boolean
): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.License_Add(name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('LICENSE_ADD', 'LICENSE_ADD_RESULT', {
name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire
});
}
}
/**
* 라이선스 수정
*/
public async updateLicense(
idx: number,
name: string,
version: string,
meterialNo: string,
supply: string,
qty: number,
uids: string,
serialNo: string,
remark: string,
sdate: string,
edate: string,
manu: string,
expire: boolean
): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.License_Update(idx, name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('LICENSE_UPDATE', 'LICENSE_UPDATE_RESULT', {
idx, name, version, meterialNo, supply, qty, uids, serialNo, remark, sdate, edate, manu, expire
});
}
}
/**
* 라이선스 삭제
*/
public async deleteLicense(idx: number): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.License_Delete(idx);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('LICENSE_DELETE', 'LICENSE_DELETE_RESULT', { idx });
}
}
/**
* 라이선스 폴더 열기
*/
public async openLicenseFolder(idx: number): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.License_OpenFolder(idx);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('LICENSE_OPEN_FOLDER', 'LICENSE_OPEN_FOLDER_RESULT', { idx });
}
}
/**
* 라이선스 CSV 내보내기
*/
public async exportLicenseCSV(filePath: string): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.License_ExportCSV(filePath);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('LICENSE_EXPORT_CSV', 'LICENSE_EXPORT_CSV_RESULT', { filePath });
}
}
// ===== PartList API =====
/**
* 프로젝트별 파트리스트 조회
*/
public async getPartList(projectIdx: number): Promise<ApiResponse<PartListItem[]>> {
if (isWebView && machine) {
const result = await machine.PartList_GetList(projectIdx);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse<PartListItem[]>>('PARTLIST_GET_LIST', 'PARTLIST_LIST_DATA', { projectIdx });
}
}
/**
* 파트리스트 항목 저장 (추가/수정)
*/
public async savePartList(
idx: number,
projectIdx: number,
itemgroup: string,
itemname: string,
item: string,
itemmodel: string,
itemscale: string,
itemunit: string,
qty: number,
price: number,
itemsupply: string,
itemsupplyidx: number,
itemmanu: string,
itemsid: string,
option1: string,
remark: string,
no: number,
qtybuy: number
): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.PartList_Save(
idx, projectIdx, itemgroup, itemname, item, itemmodel, itemscale,
itemunit, qty, price, itemsupply, itemsupplyidx, itemmanu, itemsid,
option1, remark, no, qtybuy
);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('PARTLIST_SAVE', 'PARTLIST_SAVE_RESULT', {
idx, projectIdx, itemgroup, itemname, item, itemmodel, itemscale,
itemunit, qty, price, itemsupply, itemsupplyidx, itemmanu, itemsid,
option1, remark, no, qtybuy
});
}
}
/**
* 파트리스트 항목 삭제
*/
public async deletePartList(idx: number): Promise<ApiResponse> {
if (isWebView && machine) {
const result = await machine.PartList_Delete(idx);
return JSON.parse(result);
} else {
return this.wsRequest<ApiResponse>('PARTLIST_DELETE', 'PARTLIST_DELETE_RESULT', { idx });
}
}
}
export const comms = new CommunicationLayer();

View File

@@ -93,6 +93,19 @@ export function FavoriteDialog({ isOpen, onClose }: FavoriteDialogProps) {
}
}, [isOpen]);
useEffect(() => {
const handleEscape = (e: KeyboardEvent) => {
if (e.key === 'Escape' && isOpen) {
onClose();
}
};
if (isOpen) {
window.addEventListener('keydown', handleEscape);
return () => window.removeEventListener('keydown', handleEscape);
}
}, [isOpen, onClose]);
const loadFavorites = async () => {
setLoading(true);
try {

View File

@@ -0,0 +1,507 @@
import { useState, useEffect } from 'react';
import { X, Save, Calendar, Clock, MapPin, User, FileText, AlertCircle } from 'lucide-react';
import { comms } from '@/communication';
import { HolidayRequest, CommonCode } from '@/types';
interface HolidayRequestDialogProps {
isOpen: boolean;
onClose: () => void;
onSave: () => void;
initialData?: HolidayRequest | null;
userLevel: number;
currentUserId: string;
currentUserName: string;
}
export function HolidayRequestDialog({
isOpen,
onClose,
onSave,
initialData,
userLevel,
currentUserId,
// currentUserName
}: HolidayRequestDialogProps) {
const [loading, setLoading] = useState(false);
const [codes, setCodes] = useState<{
cate: CommonCode[];
reason: CommonCode[];
location: CommonCode[];
backup: CommonCode[];
}>({
cate: [],
reason: [],
location: [],
backup: []
});
const [users, setUsers] = useState<Array<{ id: string; name: string }>>([]);
// Form State
const [formData, setFormData] = useState<HolidayRequest>({
idx: 0,
gcode: '',
uid: currentUserId,
cate: '',
sdate: new Date().toISOString().split('T')[0],
edate: new Date().toISOString().split('T')[0],
Remark: '',
wuid: currentUserId,
wdate: '',
Response: '',
conf: 0,
HolyReason: '',
HolyBackup: '',
HolyLocation: '',
HolyDays: 0,
HolyTimes: 0,
stime: '09:00',
etime: '18:00',
sendmail: false
});
const [requestType, setRequestType] = useState<'day' | 'time' | 'out'>('day'); // day: 휴가, time: 대체, out: 외출
useEffect(() => {
if (isOpen) {
loadCodes();
if (userLevel >= 5) {
loadUsers();
}
if (initialData) {
setFormData({ ...initialData });
// Determine request type based on data
if (initialData.cate === '외출') {
setRequestType('out');
} else if (initialData.cate === '대체') {
setRequestType('time');
} else {
setRequestType('day');
}
} else {
// Reset form for new entry
setFormData({
idx: 0,
gcode: '',
uid: currentUserId,
cate: '',
sdate: new Date().toISOString().split('T')[0],
edate: new Date().toISOString().split('T')[0],
Remark: '',
wuid: currentUserId,
wdate: '',
Response: '',
conf: 0,
HolyReason: '',
HolyBackup: '',
HolyLocation: '',
HolyDays: 0,
HolyTimes: 0,
stime: '09:00',
etime: '18:00',
sendmail: false
});
setRequestType('day');
}
}
}, [isOpen, initialData, currentUserId]);
const loadCodes = async () => {
try {
const [cateRes, reasonRes, locationRes, backupRes] = await Promise.all([
comms.getCommonList('50'),
comms.getCommonList('51'),
comms.getCommonList('52'),
comms.getCommonList('53')
]);
setCodes({
cate: cateRes || [],
reason: reasonRes || [],
location: locationRes || [],
backup: backupRes || []
});
// Set default category if new
if (!initialData && cateRes && cateRes.length > 0) {
setFormData(prev => ({ ...prev, cate: cateRes[0].svalue }));
}
} catch (error) {
console.error('Failed to load codes:', error);
}
};
const loadUsers = async () => {
try {
const userList = await comms.getUserList('');
if (userList && userList.length > 0) {
const mappedUsers = userList.map((u: any) => ({
id: u.id || u.Id,
name: u.name || u.NameK || u.id
}));
setUsers(mappedUsers);
}
} catch (error) {
console.error('Failed to load users:', error);
}
};
const handleSave = async () => {
// Validation
if (!formData.cate && requestType === 'day') {
alert('구분을 선택하세요.');
return;
}
if (formData.sdate > formData.edate) {
alert('종료일이 시작일보다 빠를 수 없습니다.');
return;
}
// Prepare data based on type
const dataToSave = { ...formData };
if (requestType === 'out') {
dataToSave.cate = '외출';
dataToSave.HolyDays = 0;
// Calculate times if needed, or rely on user input?
// WinForms doesn't seem to auto-calc times for 'out', just saves stime/etime.
} else if (requestType === 'time') {
dataToSave.cate = '대체';
dataToSave.HolyDays = 0;
} else {
// Day
dataToSave.HolyTimes = 0;
dataToSave.stime = '';
dataToSave.etime = '';
// Calculate days
const start = new Date(dataToSave.sdate);
const end = new Date(dataToSave.edate);
const diffTime = Math.abs(end.getTime() - start.getTime());
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1;
dataToSave.HolyDays = diffDays;
}
setLoading(true);
try {
const response = await comms.saveHolidayRequest(dataToSave);
if (response.Success) {
onSave();
onClose();
} else {
alert('저장 실패: ' + response.Message);
}
} catch (error) {
console.error('Save error:', error);
alert('저장 중 오류가 발생했습니다.');
} finally {
setLoading(false);
}
};
if (!isOpen) return null;
return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm p-4">
<div className="bg-white rounded-xl shadow-2xl w-full max-w-2xl max-h-[90vh] overflow-y-auto">
{/* Header */}
<div className="flex items-center justify-between px-6 py-4 border-b border-gray-100">
<h2 className="text-xl font-bold text-gray-800">
{formData.idx === 0 ? '휴가/외출 신청' : '신청 내역 수정'}
</h2>
<button onClick={onClose} className="p-2 hover:bg-gray-100 rounded-full transition-colors">
<X className="w-5 h-5 text-gray-500" />
</button>
</div>
{/* Body */}
<div className="p-6 space-y-6">
{/* Request Type */}
<div className="flex gap-4 p-4 bg-gray-50 rounded-lg">
<label className="flex items-center gap-2 cursor-pointer">
<input
type="radio"
name="type"
checked={requestType === 'day'}
onChange={() => setRequestType('day')}
className="w-4 h-4 text-blue-600"
disabled={formData.idx > 0 && initialData?.cate !== '대체' && initialData?.cate !== '외출'}
/>
<span className="font-medium text-gray-700"></span>
</label>
<label className="flex items-center gap-2 cursor-pointer">
<input
type="radio"
name="type"
checked={requestType === 'time'}
onChange={() => setRequestType('time')}
className="w-4 h-4 text-blue-600"
disabled={formData.idx > 0 && initialData?.cate !== '대체'}
/>
<span className="font-medium text-gray-700">()</span>
</label>
<label className="flex items-center gap-2 cursor-pointer">
<input
type="radio"
name="type"
checked={requestType === 'out'}
onChange={() => setRequestType('out')}
className="w-4 h-4 text-blue-600"
disabled={formData.idx > 0 && initialData?.cate !== '외출'}
/>
<span className="font-medium text-gray-700"></span>
</label>
</div>
{/* User Selection (Admin only) */}
{userLevel >= 5 && (
<div className="grid grid-cols-1 gap-2">
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
<User className="w-4 h-4" />
</label>
<select
value={formData.uid}
onChange={(e) => setFormData({ ...formData, uid: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
disabled={formData.idx > 0}
>
{users.map(user => (
<option key={user.id} value={user.id}>{user.name} ({user.id})</option>
))}
</select>
</div>
)}
{/* Date & Time */}
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
<Calendar className="w-4 h-4" />
</label>
<input
type="date"
value={formData.sdate}
onChange={(e) => setFormData({ ...formData, sdate: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
<Calendar className="w-4 h-4" />
</label>
<input
type="date"
value={formData.edate}
onChange={(e) => setFormData({ ...formData, edate: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
</div>
{(requestType === 'time' || requestType === 'out') && (
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
<Clock className="w-4 h-4" />
</label>
<input
type="time"
value={formData.stime}
onChange={(e) => setFormData({ ...formData, stime: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
<Clock className="w-4 h-4" />
</label>
<input
type="time"
value={formData.etime}
onChange={(e) => setFormData({ ...formData, etime: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
</div>
)}
{/* Category & Reason */}
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
<FileText className="w-4 h-4" />
</label>
{requestType === 'day' ? (
<select
value={formData.cate}
onChange={(e) => setFormData({ ...formData, cate: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
>
{codes.cate.map(code => (
<option key={code.code} value={code.svalue}>{code.svalue}</option>
))}
</select>
) : (
<input
type="text"
value={requestType === 'out' ? '외출' : '대체'}
disabled
className="w-full px-3 py-2 border border-gray-300 rounded-lg bg-gray-100 text-gray-500"
/>
)}
</div>
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
<AlertCircle className="w-4 h-4" />
</label>
<select
value={formData.HolyReason}
onChange={(e) => setFormData({ ...formData, HolyReason: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
>
<option value=""></option>
{codes.reason.map(code => (
<option key={code.code} value={code.svalue}>{code.svalue}</option>
))}
</select>
</div>
</div>
{/* Location & Backup */}
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
<MapPin className="w-4 h-4" />
</label>
<select
value={formData.HolyLocation}
onChange={(e) => setFormData({ ...formData, HolyLocation: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
>
<option value=""></option>
{codes.location.map(code => (
<option key={code.code} value={code.svalue}>{code.svalue}</option>
))}
</select>
</div>
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700 flex items-center gap-2">
<User className="w-4 h-4" />
</label>
<select
value={formData.HolyBackup}
onChange={(e) => setFormData({ ...formData, HolyBackup: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
>
<option value=""></option>
{codes.backup.map(code => (
<option key={code.code} value={code.svalue}>{code.svalue}</option>
))}
</select>
</div>
</div>
{/* Days & Times (Manual Override) */}
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700"></label>
<input
type="number"
step="0.5"
value={formData.HolyDays}
onChange={(e) => setFormData({ ...formData, HolyDays: parseFloat(e.target.value) })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
disabled={requestType !== 'day'}
/>
</div>
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700"></label>
<input
type="number"
step="0.5"
value={formData.HolyTimes}
onChange={(e) => setFormData({ ...formData, HolyTimes: parseFloat(e.target.value) })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
disabled={requestType === 'day'}
/>
</div>
</div>
{/* Remark */}
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700"></label>
<textarea
value={formData.Remark}
onChange={(e) => setFormData({ ...formData, Remark: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent h-20 resize-none"
/>
</div>
{/* Admin Response & Confirmation */}
{userLevel >= 5 && (
<div className="p-4 bg-blue-50 rounded-lg space-y-4 border border-blue-100">
<h3 className="font-semibold text-blue-800"> </h3>
<div className="flex gap-4">
<label className="flex items-center gap-2 cursor-pointer">
<input
type="radio"
name="conf"
checked={formData.conf === 0}
onChange={() => setFormData({ ...formData, conf: 0 })}
className="w-4 h-4 text-blue-600"
/>
<span className="text-gray-700"></span>
</label>
<label className="flex items-center gap-2 cursor-pointer">
<input
type="radio"
name="conf"
checked={formData.conf === 1}
onChange={() => setFormData({ ...formData, conf: 1 })}
className="w-4 h-4 text-green-600"
/>
<span className="text-gray-700"></span>
</label>
<label className="flex items-center gap-2 cursor-pointer">
<input
type="radio"
name="conf"
checked={formData.conf === 2}
onChange={() => setFormData({ ...formData, conf: 2 })}
className="w-4 h-4 text-red-600"
/>
<span className="text-gray-700"></span>
</label>
</div>
<div className="space-y-2">
<label className="text-sm font-medium text-gray-700"> </label>
<input
type="text"
value={formData.Response}
onChange={(e) => setFormData({ ...formData, Response: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/>
</div>
</div>
)}
</div>
{/* Footer */}
<div className="flex items-center justify-end gap-3 px-6 py-4 border-t border-gray-100 bg-gray-50 rounded-b-xl">
<button
onClick={onClose}
className="px-4 py-2 text-gray-600 hover:bg-gray-200 rounded-lg transition-colors font-medium"
>
</button>
<button
onClick={handleSave}
disabled={loading}
className="flex items-center gap-2 px-6 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg shadow-lg shadow-blue-500/30 transition-all font-medium disabled:opacity-50"
>
<Save className="w-4 h-4" />
{loading ? '저장 중...' : '저장'}
</button>
</div>
</div>
</div>
);
}

View File

@@ -319,7 +319,7 @@ export function JobReportDayDialog({ isOpen, onClose, initialMonth }: JobReportD
);
})}
<td className="px-3 py-2 text-center text-sm text-white border border-white/10 font-medium whitespace-nowrap">
{row.totalHrs}+{row.totalOt}(*{row.totalHolidayOt})
{row.totalHrs.toFixed(1)}+{row.totalOt.toFixed(1)}(*{row.totalHolidayOt.toFixed(1)})
</td>
</tr>
))

View File

@@ -95,12 +95,15 @@ export function JobreportEditModal({
try {
// WebSocket 모드에서는 같은 응답타입을 사용하므로 순차적으로 로드
const requestPart = await comms.getCommonList('13'); // 요청부서
if (requestPart) requestPart.sort((a, b) => (a.memo || a.svalue || '').localeCompare(b.memo || b.svalue || ''));
setRequestPartList(requestPart || []);
const packages = await comms.getCommonList('14'); // 패키지
if (packages) packages.sort((a, b) => (a.memo || a.svalue || '').localeCompare(b.memo || b.svalue || ''));
setPackageList(packages || []);
const processes = await comms.getCommonList('16'); // 공정(프로세스)
if (processes) processes.sort((a, b) => (a.memo || a.svalue || '').localeCompare(b.memo || b.svalue || ''));
setProcessList(processes || []);
const statuses = await comms.getCommonList('12'); // 상태
@@ -118,6 +121,58 @@ export function JobreportEditModal({
}
}, [isOpen, loadCommonCodes]);
// 모달 열릴 때 프로젝트가 설정되어 있으면 자동으로 최종 설정 불러오기
useEffect(() => {
const loadLastSettings = async () => {
// 신규 등록이고, 프로젝트가 설정되어 있으며, 기본값이 비어있는 경우에만 자동 로드
if (isOpen && !editingItem && formData.pidx && formData.pidx > 0) {
// 이미 설정된 값이 있으면 자동 로드하지 않음 (복사 기능 등에서 이미 값이 있을 수 있음)
const hasExistingSettings = formData.requestpart || formData.package || formData.type || formData.process;
if (hasExistingSettings) {
setPreviousProjectIdx(formData.pidx);
return;
}
try {
const lastReport = await comms.getLastJobReportByProject(formData.pidx, formData.projectName);
if (lastReport.Success && lastReport.Data) {
const updatedFormData = { ...formData };
if (lastReport.Data.requestpart) {
updatedFormData.requestpart = lastReport.Data.requestpart;
}
if (lastReport.Data.package) {
updatedFormData.package = lastReport.Data.package;
}
if (lastReport.Data.type) {
updatedFormData.type = lastReport.Data.type;
}
if (lastReport.Data.jobgrp) {
updatedFormData.jobgrp = lastReport.Data.jobgrp;
}
if (lastReport.Data.process) {
updatedFormData.process = lastReport.Data.process;
}
if (lastReport.Data.status) {
updatedFormData.status = lastReport.Data.status;
}
onFormChange(updatedFormData);
}
setPreviousProjectIdx(formData.pidx);
} catch (error) {
console.error('최종 설정 불러오기 오류:', error);
setPreviousProjectIdx(formData.pidx);
}
} else if (isOpen && !editingItem) {
// 신규 등록인데 프로젝트가 없으면 초기화
setPreviousProjectIdx(null);
}
};
loadLastSettings();
}, [isOpen, editingItem]);
if (!isOpen) return null;
const handleFieldChange = <K extends keyof JobreportFormData>(
@@ -210,7 +265,9 @@ export function JobreportEditModal({
onMouseDown={(e) => e.stopPropagation()}
>
{/* 헤더 */}
<div className="px-6 py-4 border-b border-white/10 flex items-center justify-between sticky top-0 bg-slate-800/95 backdrop-blur z-10">
<div className={`px-6 py-4 border-b border-white/10 flex items-center justify-between sticky top-0 backdrop-blur z-10 ${
editingItem ? 'bg-slate-800/95' : 'bg-primary-600/30'
}`}>
<h2 className="text-xl font-semibold text-white flex items-center">
<FileText className="w-5 h-5 mr-2" />
{editingItem ? '업무일지 수정' : '업무일지 등록'}

View File

@@ -15,14 +15,19 @@ import {
User,
Users,
CalendarDays,
Calendar,
Mail,
Shield,
List,
AlertTriangle,
Building,
Star,
Bug,
Settings,
Key,
} from 'lucide-react';
import { clsx } from 'clsx';
import { comms } from '@/communication';
import { UserInfoDialog } from '@/components/user/UserInfoDialog';
import { UserGroupDialog } from '@/components/user/UserGroupDialog';
import { KuntaeErrorCheckDialog } from '@/components/kuntae/KuntaeErrorCheckDialog';
@@ -38,6 +43,7 @@ interface NavItem {
icon: React.ElementType;
label: string;
action?: string;
className?: string; // 추가: 클래스 이름
}
interface SubMenu {
@@ -53,6 +59,7 @@ interface MenuItem {
label: string;
submenu?: SubMenu;
action?: string;
className?: string; // gold 등 스타일 적용용
}
interface DropdownMenuConfig {
@@ -75,58 +82,76 @@ const leftDropdownMenus: DropdownMenuConfig[] = [
items: [
{ type: 'link', path: '/kuntae', icon: List, label: '목록' },
{ type: 'action', icon: AlertTriangle, label: '오류검사', action: 'kuntaeErrorCheck' },
{ type: 'link', path: '/holiday-request', icon: Calendar, label: '휴가/외출 신청' },
],
},
{
label: '관리',
icon: Settings,
items: [
{ type: 'link', path: '/license', icon: Key, label: '라이선스' },
],
},
];
// 좌측 단독 액션 버튼 (즐겨찾기)
const leftActionItems: NavItem[] = [
{ icon: Star, label: '즐겨찾기', action: 'favorite' },
];
// 좌측 단독 액션 버튼
const leftActionItems: NavItem[] = [];
// 우측 메뉴 항목
const rightNavItems: NavItem[] = [
{ icon: Star, label: '즐겨찾기', action: 'favorite' },
{ path: '/todo', icon: CheckSquare, label: '할일' },
];
// 드롭다운 메뉴 (2단계 지원)
const dropdownMenus: DropdownMenuConfig[] = [
{
label: '공용정보',
icon: Database,
items: [
{ type: 'link', path: '/common', icon: Code, label: '공용코드' },
{ type: 'link', path: '/items', icon: Package, label: '품목정보' },
{ type: 'link', path: '/customs', icon: Building, label: '업체정보' },
{
type: 'submenu',
icon: Users,
label: '사용자',
submenu: {
label: '사용자',
const getDropdownMenus = (userLevel: number, userCode: string): DropdownMenuConfig[] => {
const mailListItem = {
type: 'link' as const,
path: '/mail-list',
icon: Mail,
label: '메일 내역',
className: (userCode === '395552') ? 'text-[gold] font-bold' : '',
};
return [
{
label: '공용정보',
icon: Database,
items: [
{ type: 'link', path: '/common', icon: Code, label: '공용코드' },
{ type: 'link', path: '/items', icon: Package, label: '품목정보' },
{ type: 'link', path: '/customs', icon: Building, label: '업체정보' },
{
type: 'submenu',
icon: Users,
items: [
{ icon: User, label: '정보', action: 'userInfo' },
{ path: '/user/list', icon: Users, label: '목록' },
{ path: '/user/auth', icon: Shield, label: '권한' },
{ icon: Users, label: '그룹정보', action: 'userGroup' },
],
label: '사용자',
submenu: {
label: '사용자',
icon: Users,
items: [
{ icon: User, label: '정보', action: 'userInfo' },
{ path: '/user/list', icon: Users, label: '목록' },
{ path: '/user/auth', icon: Shield, label: '권한' },
{ icon: Users, label: '그룹정보', action: 'userGroup' },
],
},
},
},
{ type: 'link', path: '/monthly-work', icon: CalendarDays, label: '월별근무표' },
{ type: 'link', path: '/mail-form', icon: Mail, label: '메일양식' },
],
},
{
label: '문서',
icon: FileText,
items: [
{ type: 'link', path: '/note', icon: FileText, label: '메모장' },
{ type: 'link', path: '/patch-list', icon: FileText, label: '패치 내역' },
{ type: 'link', path: '/mail-list', icon: Mail, label: '메일 내역' },
],
},
];
{ type: 'link', path: '/monthly-work', icon: CalendarDays, label: '월별근무표' },
{ type: 'link', path: '/mail-form', icon: Mail, label: '메일양식' },
],
},
{
label: '문서',
icon: FileText,
items: [
{ type: 'link', path: '/note', icon: FileText, label: '메모장' },
{ type: 'link', path: '/patch-list', icon: FileText, label: '패치 내역' },
{ type: 'link', path: '/bug-report', icon: Bug, label: '버그 신고' },
...(userLevel >= 9 || userCode === '395552' ? [mailListItem] : []),
],
},
];
};
function DropdownNavMenu({
menu,
@@ -193,7 +218,7 @@ function DropdownNavMenu({
'flex items-center space-x-2 px-4 py-2 text-sm transition-colors',
isActive
? 'bg-white/20 text-white'
: 'text-white/70 hover:bg-white/10 hover:text-white'
: (item.className || 'text-white/70 hover:bg-white/10 hover:text-white')
)
}
>
@@ -325,7 +350,7 @@ function MobileDropdownMenu({
'flex items-center space-x-3 px-4 py-2 rounded-lg transition-all duration-200',
isActive
? 'bg-white/20 text-white'
: 'text-white/70 hover:bg-white/10 hover:text-white'
: (item.className || 'text-white/70 hover:bg-white/10 hover:text-white')
)
}
>
@@ -372,7 +397,7 @@ function MobileDropdownMenu({
'flex items-center space-x-3 px-4 py-2 rounded-lg transition-all duration-200',
isActive
? 'bg-white/20 text-white'
: 'text-white/70 hover:bg-white/10 hover:text-white'
: (item.className || 'text-white/70 hover:bg-white/10 hover:text-white')
)
}
>
@@ -408,6 +433,27 @@ export function Header(_props: HeaderProps) {
const [showUserGroupDialog, setShowUserGroupDialog] = useState(false);
const [showKuntaeErrorCheckDialog, setShowKuntaeErrorCheckDialog] = useState(false);
const [showFavoriteDialog, setShowFavoriteDialog] = useState(false);
const [userLevel, setUserLevel] = useState<number>(0);
const [userCode, setUserCode] = useState<string>('');
// 사용자 정보 로드
useEffect(() => {
const loadUserInfo = async () => {
try {
const loginStatus = await comms.checkLoginStatus();
console.log('Login Status:', loginStatus);
if (loginStatus.Success && loginStatus.IsLoggedIn && loginStatus.User) {
const user = loginStatus.User as { Level?: number; Id?: string };
setUserLevel(user.Level || 0);
setUserCode(user.Id || '');
console.log('userLevel:', user.Level, 'userCode:', user.Id);
}
} catch (error) {
console.error('사용자 정보 로드 오류:', error);
}
};
loadUserInfo();
}, []);
const handleAction = (action: string) => {
if (action === 'userInfo') {
@@ -484,27 +530,38 @@ export function Header(_props: HeaderProps) {
{/* Desktop Navigation - Right */}
<nav className="hidden lg:flex items-center space-x-1">
{/* 드롭다운 메뉴들 (공용정보) */}
{dropdownMenus.map((menu) => (
{getDropdownMenus(userLevel, userCode).map((menu) => (
<DropdownNavMenu key={menu.label} menu={menu} onAction={handleAction} />
))}
{/* 우측 메뉴들 (할일) */}
{/* 우측 메뉴들 (즐겨찾기, 할일) */}
{rightNavItems.map((item) => (
<NavLink
key={item.path}
to={item.path!}
className={({ isActive }) =>
clsx(
'flex items-center space-x-2 px-4 py-2 rounded-lg transition-all duration-200 text-sm font-medium',
isActive
? 'bg-white/20 text-white shadow-lg'
: 'text-white/70 hover:bg-white/10 hover:text-white'
)
}
>
<item.icon className="w-4 h-4" />
<span>{item.label}</span>
</NavLink>
item.path ? (
<NavLink
key={item.path}
to={item.path}
className={({ isActive }) =>
clsx(
'flex items-center space-x-2 px-4 py-2 rounded-lg transition-all duration-200 text-sm font-medium',
isActive
? 'bg-white/20 text-white shadow-lg'
: 'text-white/70 hover:bg-white/10 hover:text-white'
)
}
>
<item.icon className="w-4 h-4" />
<span>{item.label}</span>
</NavLink>
) : (
<button
key={item.label}
onClick={() => item.action && handleAction(item.action)}
className="flex items-center space-x-2 px-4 py-2 rounded-lg transition-all duration-200 text-sm font-medium text-white/70 hover:bg-white/10 hover:text-white"
>
<item.icon className="w-4 h-4" />
<span>{item.label}</span>
</button>
)
))}
</nav>
</div>
@@ -562,7 +619,7 @@ export function Header(_props: HeaderProps) {
<div className="border-t border-white/10 my-2" />
{/* 우측 드롭다운 메뉴들 (공용정보) */}
{dropdownMenus.map((menu) => (
{getDropdownMenus(userLevel, userCode).map((menu) => (
<MobileDropdownMenu
key={menu.label}
menu={menu}
@@ -571,24 +628,38 @@ export function Header(_props: HeaderProps) {
/>
))}
{/* 우측 메뉴들 (할일) */}
{/* 우측 메뉴들 (즐겨찾기, 할일) */}
{rightNavItems.map((item) => (
<NavLink
key={item.path}
to={item.path!}
onClick={() => setIsMobileMenuOpen(false)}
className={({ isActive }) =>
clsx(
'flex items-center space-x-3 px-4 py-3 rounded-lg transition-all duration-200',
isActive
? 'bg-white/20 text-white'
: 'text-white/70 hover:bg-white/10 hover:text-white'
)
}
>
<item.icon className="w-5 h-5" />
<span className="font-medium">{item.label}</span>
</NavLink>
item.path ? (
<NavLink
key={item.path}
to={item.path}
onClick={() => setIsMobileMenuOpen(false)}
className={({ isActive }) =>
clsx(
'flex items-center space-x-3 px-4 py-3 rounded-lg transition-all duration-200',
isActive
? 'bg-white/20 text-white'
: 'text-white/70 hover:bg-white/10 hover:text-white'
)
}
>
<item.icon className="w-5 h-5" />
<span className="font-medium">{item.label}</span>
</NavLink>
) : (
<button
key={item.label}
onClick={() => {
if (item.action) handleAction(item.action);
setIsMobileMenuOpen(false);
}}
className="flex items-center space-x-3 px-4 py-3 rounded-lg transition-all duration-200 text-white/70 hover:bg-white/10 hover:text-white w-full text-left"
>
<item.icon className="w-5 h-5" />
<span className="font-medium">{item.label}</span>
</button>
)
))}
</nav>
</div>

View File

@@ -12,6 +12,7 @@ interface StatusBarProps {
export function StatusBar({ userName, userDept, isConnected }: StatusBarProps) {
const [currentTime, setCurrentTime] = useState(new Date());
const [versionDisplay, setVersionDisplay] = useState('');
const [hasNewVersion, setHasNewVersion] = useState(false);
useEffect(() => {
const timer = setInterval(() => setCurrentTime(new Date()), 1000);
@@ -25,6 +26,7 @@ export function StatusBar({ userName, userDept, isConnected }: StatusBarProps) {
const result = await comms.getAppVersion();
if (result.Success) {
setVersionDisplay(result.DisplayVersion);
setHasNewVersion(result.HasNewVersion || false);
}
} catch (error) {
console.error('버전 정보 로드 오류:', error);
@@ -41,8 +43,13 @@ export function StatusBar({ userName, userDept, isConnected }: StatusBarProps) {
</div>
{/* Center: App Version */}
<div className="text-white/50">
<div className={`font-medium ${hasNewVersion ? 'text-yellow-400 animate-pulse' : 'text-white/50'}`}>
{versionDisplay || 'Loading...'}
{hasNewVersion && (
<span className="ml-2 text-xs bg-yellow-500/20 text-yellow-400 px-2 py-0.5 rounded animate-pulse">
</span>
)}
</div>
{/* Right: Connection Status & Time */}

View File

@@ -0,0 +1,293 @@
import { X, Save, Trash2 } from 'lucide-react';
import { useState, useEffect } from 'react';
import type { LicenseItem } from '@/types';
interface LicenseEditDialogProps {
item: LicenseItem | null;
isOpen: boolean;
onClose: () => void;
onSave: (data: Partial<LicenseItem>) => Promise<void>;
onDelete?: (idx: number) => Promise<void>;
}
export function LicenseEditDialog({ item, isOpen, onClose, onSave, onDelete }: LicenseEditDialogProps) {
const [formData, setFormData] = useState<Partial<LicenseItem>>({});
const [saving, setSaving] = useState(false);
useEffect(() => {
if (item) {
setFormData({
idx: item.idx,
expire: item.expire || false,
name: item.name || '',
version: item.version || '',
meterialNo: item.meterialNo || '',
supply: item.supply || '',
qty: item.qty || 1,
uids: item.uids || '',
serialNo: item.serialNo || '',
remark: item.remark || '',
sdate: item.sdate ? item.sdate.split('T')[0] : '',
edate: item.edate ? item.edate.split('T')[0] : '',
manu: item.manu || '',
});
}
}, [item]);
useEffect(() => {
const handleEscape = (e: KeyboardEvent) => {
if (e.key === 'Escape' && isOpen) {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleEscape);
return () => document.removeEventListener('keydown', handleEscape);
}
}, [isOpen, onClose]);
const handleSave = async () => {
if (!formData.name?.trim()) {
alert('제품명을 입력해주세요.');
return;
}
setSaving(true);
try {
await onSave(formData);
onClose();
} catch (error) {
console.error('Save failed:', error);
alert('저장에 실패했습니다.');
} finally {
setSaving(false);
}
};
const handleDelete = async () => {
if (!formData.idx) return;
if (!confirm('삭제하시겠습니까?')) return;
setSaving(true);
try {
if (onDelete) {
await onDelete(formData.idx);
}
onClose();
} catch (error) {
console.error('Delete failed:', error);
alert('삭제에 실패했습니다.');
} finally {
setSaving(false);
}
};
if (!isOpen) return null;
return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50" onClick={onClose}>
<div className="glass-effect rounded-lg w-full max-w-3xl max-h-[90vh] overflow-y-auto m-4" onClick={(e) => e.stopPropagation()}>
{/* Header */}
<div className="flex items-center justify-between p-4 border-b border-white/10">
<h2 className="text-xl font-semibold text-white">
{formData.idx ? '라이선스 수정' : '라이선스 추가'}
</h2>
<button
onClick={onClose}
className="text-white/70 hover:text-white transition-colors"
>
<X className="w-6 h-6" />
</button>
</div>
{/* Body */}
<div className="p-6 space-y-6">
{/* 기본 정보 */}
<div className="space-y-4">
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
<span> </span>
</h3>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-1 flex items-center">
<label className="flex items-center space-x-2 cursor-pointer">
<input
type="checkbox"
checked={formData.expire || false}
onChange={(e) => setFormData({ ...formData, expire: e.target.checked })}
className="w-4 h-4"
/>
<span className="text-sm text-white/70"></span>
</label>
</div>
<div className="col-span-5">
<label className="block text-sm text-white/70 mb-1"> *</label>
<input
type="text"
value={formData.name || ''}
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
<div className="col-span-3">
<label className="block text-sm text-white/70 mb-1"></label>
<input
type="text"
value={formData.version || ''}
onChange={(e) => setFormData({ ...formData, version: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
<div className="col-span-3">
<label className="block text-sm text-white/70 mb-1"></label>
<input
type="text"
value={formData.meterialNo || ''}
onChange={(e) => setFormData({ ...formData, meterialNo: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
</div>
</div>
{/* 공급 정보 */}
<div className="space-y-4">
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
<span> </span>
</h3>
<div className="grid grid-cols-2 gap-4">
<div>
<label className="block text-sm text-white/70 mb-1"></label>
<input
type="text"
value={formData.supply || ''}
onChange={(e) => setFormData({ ...formData, supply: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
<div>
<label className="block text-sm text-white/70 mb-1"></label>
<input
type="text"
value={formData.manu || ''}
onChange={(e) => setFormData({ ...formData, manu: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
</div>
</div>
{/* 사용 정보 */}
<div className="space-y-4">
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
<span> </span>
</h3>
<div className="grid grid-cols-12 gap-4">
<div className="col-span-2">
<label className="block text-sm text-white/70 mb-1"></label>
<input
type="number"
value={formData.qty || 1}
onChange={(e) => setFormData({ ...formData, qty: parseInt(e.target.value) || 1 })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
<div className="col-span-4">
<label className="block text-sm text-white/70 mb-1"></label>
<input
type="text"
value={formData.uids || ''}
onChange={(e) => setFormData({ ...formData, uids: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
<div className="col-span-6">
<label className="block text-sm text-white/70 mb-1">S/N</label>
<input
type="text"
value={formData.serialNo || ''}
onChange={(e) => setFormData({ ...formData, serialNo: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
</div>
</div>
{/* 기간 정보 */}
<div className="space-y-4">
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
<span> </span>
</h3>
<div className="grid grid-cols-2 gap-4">
<div>
<label className="block text-sm text-white/70 mb-1"></label>
<input
type="date"
value={formData.sdate || ''}
onChange={(e) => setFormData({ ...formData, sdate: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
<div>
<label className="block text-sm text-white/70 mb-1"></label>
<input
type="date"
value={formData.edate || ''}
onChange={(e) => setFormData({ ...formData, edate: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500"
/>
</div>
</div>
</div>
{/* 비고 */}
<div className="space-y-4">
<h3 className="text-sm font-semibold text-white/90 flex items-center space-x-2 border-b border-white/10 pb-2">
<span></span>
</h3>
<textarea
value={formData.remark || ''}
onChange={(e) => setFormData({ ...formData, remark: e.target.value })}
rows={3}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded text-white focus:outline-none focus:border-blue-500 resize-none"
placeholder="추가 메모를 입력하세요..."
/>
</div>
</div>
{/* Footer */}
<div className="flex items-center justify-between p-4 border-t border-white/10">
<div>
{formData.idx && onDelete && (
<button
onClick={handleDelete}
disabled={saving}
className="flex items-center space-x-2 px-4 py-2 bg-red-500 hover:bg-red-600 disabled:bg-gray-600 text-white rounded-lg transition-colors"
>
<Trash2 className="w-4 h-4" />
<span></span>
</button>
)}
</div>
<div className="flex items-center space-x-2">
<button
onClick={onClose}
disabled={saving}
className="px-4 py-2 bg-gray-600 hover:bg-gray-700 disabled:bg-gray-800 text-white rounded-lg transition-colors"
>
</button>
<button
onClick={handleSave}
disabled={saving}
className="flex items-center space-x-2 px-4 py-2 bg-blue-500 hover:bg-blue-600 disabled:bg-gray-600 text-white rounded-lg transition-colors"
>
<Save className="w-4 h-4" />
<span>{saving ? '저장 중...' : '저장'}</span>
</button>
</div>
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,387 @@
import { useState, useEffect } from 'react';
import {
Plus,
FolderOpen,
Download,
Search,
X,
ChevronLeft,
ChevronRight,
CheckCircle,
XCircle,
} from 'lucide-react';
import { comms } from '@/communication';
import { LicenseEditDialog } from './LicenseEditDialog';
import type { LicenseItem } from '@/types';
export function LicenseList() {
const [list, setList] = useState<LicenseItem[]>([]);
const [filteredList, setFilteredList] = useState<LicenseItem[]>([]);
const [loading, setLoading] = useState(false);
const [searchText, setSearchText] = useState('');
const [selectedItem, setSelectedItem] = useState<LicenseItem | null>(null);
const [isDialogOpen, setIsDialogOpen] = useState(false);
// Pagination
const [currentPage, setCurrentPage] = useState(1);
const pageSize = 25;
useEffect(() => {
loadData();
}, []);
useEffect(() => {
applyFilter();
}, [searchText, list]);
const loadData = async () => {
setLoading(true);
try {
const response = await comms.getLicenseList();
if (response.Success && response.Data) {
setList(response.Data);
} else {
alert(response.Message || '라이선스 목록을 불러오는데 실패했습니다.');
}
} catch (error) {
console.error('Failed to load license list:', error);
alert('라이선스 목록을 불러오는데 실패했습니다.');
} finally {
setLoading(false);
}
};
const applyFilter = () => {
if (!searchText.trim()) {
setFilteredList(list);
return;
}
const search = searchText.toLowerCase();
const filtered = list.filter((item) => {
return (
item.name?.toLowerCase().includes(search) ||
item.version?.toLowerCase().includes(search) ||
item.supply?.toLowerCase().includes(search) ||
item.manu?.toLowerCase().includes(search) ||
item.serialNo?.toLowerCase().includes(search) ||
item.meterialNo?.toLowerCase().includes(search) ||
item.remark?.toLowerCase().includes(search)
);
});
setFilteredList(filtered);
setCurrentPage(1);
};
const handleAdd = () => {
setSelectedItem({
expire: false,
name: '',
version: '',
meterialNo: '',
supply: '',
qty: 1,
uids: '',
serialNo: '',
remark: '',
sdate: new Date().toISOString().split('T')[0],
edate: '',
manu: '',
});
setIsDialogOpen(true);
};
const handleRowClick = (item: LicenseItem) => {
setSelectedItem(item);
setIsDialogOpen(true);
};
const handleSave = async (formData: Partial<LicenseItem>) => {
if (!formData.name?.trim()) {
alert('제품명을 입력해주세요.');
return;
}
try {
setLoading(true);
let response;
if (formData.idx) {
// Update
response = await comms.updateLicense(
formData.idx,
formData.name!,
formData.version || '',
formData.meterialNo || '',
formData.supply || '',
formData.qty || 1,
formData.uids || '',
formData.serialNo || '',
formData.remark || '',
formData.sdate || '',
formData.edate || '',
formData.manu || '',
formData.expire || false
);
} else {
// Add
response = await comms.addLicense(
formData.name!,
formData.version || '',
formData.meterialNo || '',
formData.supply || '',
formData.qty || 1,
formData.uids || '',
formData.serialNo || '',
formData.remark || '',
formData.sdate || '',
formData.edate || '',
formData.manu || '',
formData.expire || false
);
}
if (response.Success) {
alert(response.Message || '저장되었습니다.');
await loadData();
} else {
alert(response.Message || '저장에 실패했습니다.');
}
} catch (error) {
console.error('Failed to save license:', error);
alert('저장에 실패했습니다.');
} finally {
setLoading(false);
}
};
const handleDelete = async (idx: number) => {
try {
setLoading(true);
const response = await comms.deleteLicense(idx);
if (response.Success) {
alert(response.Message || '삭제되었습니다.');
await loadData();
} else {
alert(response.Message || '삭제에 실패했습니다.');
}
} catch (error) {
console.error('Failed to delete license:', error);
alert('삭제에 실패했습니다.');
} finally {
setLoading(false);
}
};
const handleOpenFolder = async (item: LicenseItem, e: React.MouseEvent) => {
e.stopPropagation();
if (!item.idx) {
alert('저장된 자료만 폴더를 열 수 있습니다.');
return;
}
try {
const response = await comms.openLicenseFolder(item.idx);
if (!response.Success) {
alert(response.Message || '폴더 열기에 실패했습니다.');
}
} catch (error) {
console.error('Failed to open folder:', error);
alert('폴더 열기에 실패했습니다.');
}
};
const handleExportCSV = async () => {
const filename = `license_${new Date().toISOString().split('T')[0]}.csv`;
const filepath = `C:\\Temp\\${filename}`;
try {
const response = await comms.exportLicenseCSV(filepath);
if (response.Success) {
alert(`CSV 파일이 생성되었습니다.\n\n${filepath}`);
} else {
alert(response.Message || 'CSV 내보내기에 실패했습니다.');
}
} catch (error) {
console.error('Failed to export CSV:', error);
alert('CSV 내보내기에 실패했습니다.');
}
};
const handleCloseDialog = () => {
setIsDialogOpen(false);
setSelectedItem(null);
};
// Pagination
const totalPages = Math.ceil(filteredList.length / pageSize);
const paginatedList = filteredList.slice(
(currentPage - 1) * pageSize,
currentPage * pageSize
);
const goToPreviousPage = () => {
setCurrentPage((prev) => Math.max(1, prev - 1));
};
const goToNextPage = () => {
setCurrentPage((prev) => Math.min(totalPages, prev + 1));
};
return (
<div className="p-6 space-y-4">
{/* Header */}
<div className="flex items-center justify-between">
<h1 className="text-2xl font-bold text-white"> </h1>
<div className="flex items-center space-x-2">
<button
onClick={handleAdd}
disabled={loading}
className="flex items-center space-x-2 px-4 py-2 bg-blue-500 hover:bg-blue-600 disabled:bg-gray-600 text-white rounded-lg transition-colors"
>
<Plus className="w-4 h-4" />
<span></span>
</button>
<button
onClick={handleExportCSV}
disabled={loading}
className="flex items-center space-x-2 px-4 py-2 bg-green-500 hover:bg-green-600 disabled:bg-gray-600 text-white rounded-lg transition-colors"
>
<Download className="w-4 h-4" />
<span>CSV</span>
</button>
</div>
</div>
{/* Search */}
<div className="flex items-center space-x-2">
<div className="flex-1 relative">
<Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-white/50" />
<input
type="text"
value={searchText}
onChange={(e) => setSearchText(e.target.value)}
placeholder="검색 (제품명, 버전, 공급업체, 제조사, S/N, 자재번호, 비고)"
className="w-full pl-10 pr-10 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:border-blue-500"
/>
{searchText && (
<button
onClick={() => setSearchText('')}
className="absolute right-3 top-1/2 -translate-y-1/2 text-white/50 hover:text-white"
>
<X className="w-4 h-4" />
</button>
)}
</div>
</div>
{/* Table */}
<div className="glass-effect rounded-lg overflow-hidden">
<div className="overflow-x-auto">
<table className="w-full border-collapse">
<thead className="bg-white/10">
<tr>
<th className="px-4 py-3 text-center text-sm font-semibold text-white border-r border-white/10 w-16"></th>
<th className="px-4 py-3 text-left text-sm font-semibold text-white border-r border-white/10" style={{ width: '25%' }}></th>
<th className="px-4 py-3 text-left text-sm font-semibold text-white border-r border-white/10" style={{ width: '25%' }}></th>
<th className="px-4 py-3 text-left text-sm font-semibold text-white border-r border-white/10 w-20"></th>
<th className="px-4 py-3 text-left text-sm font-semibold text-white border-r border-white/10" style={{ width: '12%' }}></th>
<th className="px-4 py-3 text-left text-sm font-semibold text-white" style={{ width: '15%' }}>S/N</th>
</tr>
</thead>
<tbody>
{loading && (
<tr>
<td colSpan={6} className="px-4 py-8 text-center text-white/70">
...
</td>
</tr>
)}
{!loading && paginatedList.length === 0 && (
<tr>
<td colSpan={6} className="px-4 py-8 text-center text-white/70">
.
</td>
</tr>
)}
{!loading &&
paginatedList.map((item) => (
<tr
key={item.idx}
onClick={() => handleRowClick(item)}
className={`border-t border-white/10 hover:bg-white/10 cursor-pointer transition-colors ${
item.expire ? 'bg-red-500/10' : ''
}`}
>
<td className="px-4 py-3 text-center border-r border-white/10">
<div className="flex justify-center" title={item.expire ? '만료' : '유효'}>
{item.expire ? (
<XCircle className="w-5 h-5 text-red-500" />
) : (
<CheckCircle className="w-5 h-5 text-green-500" />
)}
</div>
</td>
<td className="px-4 py-3 text-sm text-white border-r border-white/10 max-w-xs">
<div className="flex items-center space-x-2">
<button
onClick={(e) => handleOpenFolder(item, e)}
className="p-1 text-yellow-400 hover:text-yellow-300 transition-colors flex-shrink-0"
title="폴더 열기"
>
<FolderOpen className="w-4 h-4" />
</button>
<span className="break-words">{item.name}</span>
</div>
</td>
<td className="px-4 py-3 text-sm text-white border-r border-white/10 break-words">{item.version}</td>
<td className="px-4 py-3 text-sm text-white border-r border-white/10">{item.qty}</td>
<td className="px-4 py-3 text-sm text-white border-r border-white/10 break-words max-w-[8rem]">{item.uids}</td>
<td className="px-4 py-3 text-sm text-white break-words">{item.serialNo}</td>
</tr>
))}
</tbody>
</table>
</div>
{/* Pagination */}
{totalPages > 1 && (
<div className="flex items-center justify-between px-4 py-3 border-t border-white/10">
<div className="text-sm text-white/70">
{filteredList.length} {(currentPage - 1) * pageSize + 1}~
{Math.min(currentPage * pageSize, filteredList.length)}
</div>
<div className="flex items-center space-x-2">
<button
onClick={goToPreviousPage}
disabled={currentPage === 1}
className="p-2 text-white/70 hover:text-white disabled:text-white/30 disabled:cursor-not-allowed"
>
<ChevronLeft className="w-5 h-5" />
</button>
<span className="text-sm text-white">
{currentPage} / {totalPages}
</span>
<button
onClick={goToNextPage}
disabled={currentPage === totalPages}
className="p-2 text-white/70 hover:text-white disabled:text-white/30 disabled:cursor-not-allowed"
>
<ChevronRight className="w-5 h-5" />
</button>
</div>
</div>
)}
</div>
{/* Edit Dialog */}
<LicenseEditDialog
item={selectedItem}
isOpen={isDialogOpen}
onClose={handleCloseDialog}
onSave={handleSave}
onDelete={handleDelete}
/>
</div>
);
}

View File

@@ -0,0 +1,304 @@
import { useState, useEffect } from 'react';
import { X, Mail, Send } from 'lucide-react';
import { comms } from '@/communication';
interface MailTestDialogProps {
isOpen: boolean;
onClose: () => void;
}
export function MailTestDialog({ isOpen, onClose }: MailTestDialogProps) {
const [formData, setFormData] = useState({
cate: '테스트',
subject: '',
fromlist: '',
tolist: '',
cc: '',
bcc: '',
body: '',
});
const [processing, setProcessing] = useState(false);
useEffect(() => {
const loadUserEmail = async () => {
try {
const response = await comms.checkLoginStatus();
if (response.Success && response.IsLoggedIn && response.User) {
const user = response.User as { Email?: string };
if (user.Email) {
setFormData(prev => ({ ...prev, fromlist: user.Email || '' }));
}
}
} catch (error) {
console.error('사용자 정보 로드 오류:', error);
}
};
if (isOpen) {
loadUserEmail();
}
}, [isOpen]);
useEffect(() => {
const handleEscape = (e: KeyboardEvent) => {
if (e.key === 'Escape' && isOpen) {
onClose();
}
};
if (isOpen) {
window.addEventListener('keydown', handleEscape);
return () => window.removeEventListener('keydown', handleEscape);
}
}, [isOpen, onClose]);
const handleSubmit = async (mode: 'queue' | 'direct' | 'outlook' = 'queue') => {
if (!formData.subject.trim()) {
alert('제목을 입력해주세요.');
return;
}
if (!formData.tolist.trim()) {
alert('수신자를 입력해주세요.');
return;
}
if (!formData.body.trim()) {
alert('내용을 입력해주세요.');
return;
}
setProcessing(true);
try {
let response;
if (mode === 'outlook') {
// Outlook 미리보기
response = await comms.sendMailOutlook(
formData.subject,
formData.tolist,
formData.cc,
formData.bcc,
formData.body
);
} else if (mode === 'direct') {
// 직접 발송
response = await comms.sendMailDirect(
formData.cate,
formData.subject,
formData.fromlist,
formData.tolist,
formData.cc,
formData.bcc,
formData.body
);
} else {
// 발송 대기열에 추가
response = await comms.addMailData(
formData.cate,
formData.subject,
formData.fromlist,
formData.tolist,
formData.cc,
formData.bcc,
formData.body
);
}
if (response.Success) {
alert(response.Message || '처리되었습니다.');
if (mode !== 'outlook') {
onClose();
// 폼 초기화
setFormData({
cate: '테스트',
subject: '',
fromlist: formData.fromlist, // 발신자는 유지
tolist: '',
cc: '',
bcc: '',
body: '',
});
}
} else {
alert(response.Message || '메일 처리에 실패했습니다.');
}
} catch (error) {
console.error('메일 처리 오류:', error);
alert('메일 처리 중 오류가 발생했습니다.');
} finally {
setProcessing(false);
}
};
if (!isOpen) return null;
return (
<div className="fixed inset-0 z-[10000] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
<div className="relative w-full max-w-3xl glass-effect-solid rounded-2xl shadow-2xl overflow-hidden">
{/* Header */}
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
<div className="flex items-center gap-3">
<Mail className="w-5 h-5 text-primary-400" />
<h2 className="text-lg font-semibold text-white"> </h2>
</div>
<button
onClick={onClose}
className="p-2 rounded-lg text-white/60 hover:text-white hover:bg-white/10 transition-colors"
>
<X className="w-5 h-5" />
</button>
</div>
{/* Content */}
<div className="p-6 space-y-4 max-h-[70vh] overflow-y-auto">
{/* 분류 */}
<div>
<label className="block text-white/80 text-sm font-medium mb-2"></label>
<input
type="text"
value={formData.cate}
onChange={(e) => setFormData({ ...formData, cate: e.target.value })}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
/>
</div>
{/* 제목 */}
<div>
<label className="block text-white/80 text-sm font-medium mb-2"> *</label>
<input
type="text"
value={formData.subject}
onChange={(e) => setFormData({ ...formData, subject: e.target.value })}
placeholder="메일 제목을 입력하세요"
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
/>
</div>
{/* 발신자 */}
<div>
<label className="block text-white/80 text-sm font-medium mb-2"></label>
<input
type="text"
value={formData.fromlist}
onChange={(e) => setFormData({ ...formData, fromlist: e.target.value })}
placeholder="발신자 이메일 (쉼표로 구분)"
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
/>
</div>
{/* 수신자 */}
<div>
<label className="block text-white/80 text-sm font-medium mb-2"> *</label>
<input
type="text"
value={formData.tolist}
onChange={(e) => setFormData({ ...formData, tolist: e.target.value })}
placeholder="수신자 이메일 (쉼표로 구분)"
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
/>
</div>
{/* 참조 */}
<div>
<label className="block text-white/80 text-sm font-medium mb-2"> (CC)</label>
<input
type="text"
value={formData.cc}
onChange={(e) => setFormData({ ...formData, cc: e.target.value })}
placeholder="참조 이메일 (쉼표로 구분)"
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
/>
</div>
{/* 숨은참조 */}
<div>
<label className="block text-white/80 text-sm font-medium mb-2"> (BCC)</label>
<input
type="text"
value={formData.bcc}
onChange={(e) => setFormData({ ...formData, bcc: e.target.value })}
placeholder="숨은참조 이메일 (쉼표로 구분)"
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
/>
</div>
{/* 내용 */}
<div>
<label className="block text-white/80 text-sm font-medium mb-2"> *</label>
<textarea
value={formData.body}
onChange={(e) => setFormData({ ...formData, body: e.target.value })}
placeholder="메일 내용을 입력하세요 (HTML 가능)"
rows={8}
className="w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
/>
</div>
<div className="text-white/50 text-xs">
* . .
</div>
</div>
{/* Footer */}
<div className="flex items-center justify-end gap-2 px-6 py-4 border-t border-white/10 bg-black/20">
<button
onClick={onClose}
disabled={processing}
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors disabled:opacity-50"
>
</button>
<button
onClick={() => handleSubmit('queue')}
disabled={processing}
className="px-4 py-2 rounded-lg bg-blue-500 hover:bg-blue-600 text-white transition-colors flex items-center gap-2 disabled:opacity-50"
>
{processing ? (
<>
<div className="w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin" />
...
</>
) : (
<>
<Mail className="w-4 h-4" />
</>
)}
</button>
<button
onClick={() => handleSubmit('direct')}
disabled={processing}
className="px-4 py-2 rounded-lg bg-green-500 hover:bg-green-600 text-white transition-colors flex items-center gap-2 disabled:opacity-50"
>
{processing ? (
<>
<div className="w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin" />
...
</>
) : (
<>
<Send className="w-4 h-4" />
</>
)}
</button>
<button
onClick={() => handleSubmit('outlook')}
disabled={processing}
className="px-4 py-2 rounded-lg bg-orange-500 hover:bg-orange-600 text-white transition-colors flex items-center gap-2 disabled:opacity-50"
>
{processing ? (
<>
<div className="w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin" />
...
</>
) : (
<>
<Mail className="w-4 h-4" />
Outlook
</>
)}
</button>
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,519 @@
import { useState, useEffect } from 'react';
import { X, Save, Trash2, Plus, RefreshCw } from 'lucide-react';
import { comms } from '@/communication';
import { PartListItem } from '@/types';
interface PartListDialogProps {
projectIdx: number;
projectName: string;
onClose: () => void;
}
export function PartListDialog({ projectIdx, projectName, onClose }: PartListDialogProps) {
const [parts, setParts] = useState<PartListItem[]>([]);
const [loading, setLoading] = useState(false);
const [editingIdx, setEditingIdx] = useState<number | null>(null);
const [editForm, setEditForm] = useState<Partial<PartListItem>>({});
// ESC 키 핸들러
useEffect(() => {
const handleKeyDown = (e: KeyboardEvent) => {
if (e.key === 'Escape') {
if (editingIdx !== null) {
setEditingIdx(null);
setEditForm({});
} else {
onClose();
}
}
};
window.addEventListener('keydown', handleKeyDown);
return () => window.removeEventListener('keydown', handleKeyDown);
}, [editingIdx, onClose]);
// 데이터 로드
const loadParts = async () => {
setLoading(true);
try {
console.log('[PartList] 로드 시작, projectIdx:', projectIdx);
const result = await comms.getPartList(projectIdx);
console.log('[PartList] 결과:', result);
if (result.Success && result.Data) {
console.log('[PartList] 데이터 개수:', result.Data.length);
setParts(result.Data);
} else {
console.error('[PartList] 실패:', result.Message);
alert(result.Message || '파트리스트 로드 실패');
}
} catch (error) {
console.error('파트리스트 로드 실패:', error);
alert('파트리스트 로드 중 오류: ' + error);
} finally {
setLoading(false);
}
};
useEffect(() => {
loadParts();
}, [projectIdx]);
// 편집 시작
const startEdit = (part: PartListItem) => {
setEditingIdx(part.idx);
setEditForm({ ...part });
};
// 편집 취소
const cancelEdit = () => {
setEditingIdx(null);
setEditForm({});
};
// 저장
const handleSave = async () => {
if (!editForm.itemname || !editForm.item) {
alert('품명과 자재번호는 필수입니다.');
return;
}
try {
const result = await comms.savePartList(
editingIdx || 0,
projectIdx,
editForm.itemgroup || '',
editForm.itemname || '',
editForm.item || '',
editForm.itemmodel || '',
editForm.itemscale || '',
editForm.itemunit || '',
editForm.qty || 0,
editForm.price || 0,
editForm.itemsupply || '',
editForm.itemsupplyidx || 0,
editForm.itemmanu || '',
editForm.itemsid || '',
editForm.option1 || '',
editForm.remark || '',
editForm.no || 0,
editForm.qtybuy || 0
);
if (result.Success) {
await loadParts();
cancelEdit();
} else {
alert(result.Message || '저장 실패');
}
} catch (error) {
console.error('저장 실패:', error);
alert('저장 중 오류가 발생했습니다.');
}
};
// 삭제
const handleDelete = async (idx: number) => {
if (!confirm('정말 삭제하시겠습니까?')) return;
try {
const result = await comms.deletePartList(idx);
if (result.Success) {
await loadParts();
} else {
alert(result.Message || '삭제 실패');
}
} catch (error) {
console.error('삭제 실패:', error);
alert('삭제 중 오류가 발생했습니다.');
}
};
// 새 항목 추가
const addNew = () => {
setEditingIdx(-1);
setEditForm({
Project: projectIdx,
itemgroup: '',
itemname: '',
item: '',
itemmodel: '',
itemscale: '',
itemunit: 'EA',
qty: 1,
price: 0,
itemsupply: '',
itemsupplyidx: 0,
itemmanu: '',
itemsid: '',
option1: '',
remark: '',
no: 0,
qtybuy: 0,
});
};
// 금액 계산
const getAmount = (qty: number, price: number) => qty * price;
return (
<div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4">
<div className="bg-slate-800/95 backdrop-blur rounded-lg w-full max-w-7xl max-h-[90vh] flex flex-col shadow-2xl border border-white/10">
{/* 헤더 */}
<div className="flex items-center justify-between p-4 border-b border-white/10 bg-primary-600/30 sticky top-0 z-10">
<div>
<h2 className="text-lg font-bold text-white"></h2>
<p className="text-sm text-white/60">{projectName}</p>
</div>
<div className="flex items-center gap-2">
<button
onClick={addNew}
className="flex items-center gap-2 px-3 py-1.5 bg-primary-600 hover:bg-primary-500 text-white rounded transition-colors"
>
<Plus className="w-4 h-4" />
<span className="text-sm"></span>
</button>
<button
onClick={loadParts}
disabled={loading}
className="p-2 hover:bg-white/10 rounded transition-colors disabled:opacity-50"
title="새로고침"
>
<RefreshCw className={`w-5 h-5 text-white/70 ${loading ? 'animate-spin' : ''}`} />
</button>
<button
onClick={onClose}
className="p-2 hover:bg-white/10 rounded transition-colors"
>
<X className="w-5 h-5 text-white/70" />
</button>
</div>
</div>
{/* 테이블 */}
<div className="flex-1 overflow-auto p-4">
{loading && parts.length === 0 ? (
<div className="flex items-center justify-center h-64">
<RefreshCw className="w-8 h-8 text-primary-500 animate-spin" />
</div>
) : (
<table className="w-full border-collapse">
<thead className="sticky top-0 bg-slate-700/50 backdrop-blur z-10">
<tr className="border-b border-white/10">
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-12">No</th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-24"></th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium"></th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32"></th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32"></th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-16"></th>
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-20"></th>
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-28"></th>
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-32"></th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32"></th>
<th className="px-2 py-2 text-center text-xs text-white/70 font-medium w-20"></th>
</tr>
</thead>
<tbody>
{parts.length === 0 && !loading ? (
<tr>
<td colSpan={11} className="px-2 py-8 text-center text-white/40 text-sm">
.
</td>
</tr>
) : (
parts.map((part) => {
const isEditing = editingIdx === part.idx;
return (
<tr
key={part.idx}
className={`border-b border-white/5 hover:bg-white/5 transition-colors ${
isEditing ? 'bg-primary-500/10' : ''
}`}
>
<td className="px-2 py-2">
{isEditing ? (
<input
type="number"
value={editForm.no || 0}
onChange={(e) => setEditForm({ ...editForm, no: parseInt(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.no || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemgroup || ''}
onChange={(e) => setEditForm({ ...editForm, itemgroup: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemgroup || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemname || ''}
onChange={(e) => setEditForm({ ...editForm, itemname: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
required
/>
) : (
<span className="text-white/90 text-xs font-medium">{part.itemname || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemmodel || ''}
onChange={(e) => setEditForm({ ...editForm, itemmodel: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemmodel || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemscale || ''}
onChange={(e) => setEditForm({ ...editForm, itemscale: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemscale || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemunit || ''}
onChange={(e) => setEditForm({ ...editForm, itemunit: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemunit || ''}</span>
)}
</td>
<td className="px-2 py-2 text-right">
{isEditing ? (
<input
type="number"
value={editForm.qty || 0}
onChange={(e) => setEditForm({ ...editForm, qty: parseFloat(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
/>
) : (
<span className="text-white/70 text-xs">{part.qty?.toLocaleString() || 0}</span>
)}
</td>
<td className="px-2 py-2 text-right">
{isEditing ? (
<input
type="number"
value={editForm.price || 0}
onChange={(e) => setEditForm({ ...editForm, price: parseFloat(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
/>
) : (
<span className="text-white/70 text-xs">{part.price?.toLocaleString() || 0}</span>
)}
</td>
<td className="px-2 py-2 text-right">
<span className="text-white/90 text-xs font-medium">
{getAmount(
isEditing ? editForm.qty || 0 : part.qty || 0,
isEditing ? editForm.price || 0 : part.price || 0
).toLocaleString()}
</span>
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemsupply || ''}
onChange={(e) => setEditForm({ ...editForm, itemsupply: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemsupply || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<div className="flex items-center justify-center gap-1">
<button
onClick={handleSave}
className="p-1 hover:bg-green-500/20 text-green-400 rounded transition-colors"
title="저장"
>
<Save className="w-4 h-4" />
</button>
<button
onClick={cancelEdit}
className="p-1 hover:bg-white/10 text-white/50 rounded transition-colors"
title="취소"
>
<X className="w-4 h-4" />
</button>
</div>
) : (
<div className="flex items-center justify-center gap-1">
<button
onClick={() => startEdit(part)}
className="p-1 hover:bg-white/10 text-white/70 rounded transition-colors text-xs"
>
</button>
<button
onClick={() => handleDelete(part.idx)}
className="p-1 hover:bg-red-500/20 text-red-400 rounded transition-colors"
title="삭제"
>
<Trash2 className="w-4 h-4" />
</button>
</div>
)}
</td>
</tr>
);
})
)}
{/* 새 항목 추가 행 */}
{editingIdx === -1 && (
<tr className="border-b border-white/5 bg-primary-500/10">
<td className="px-2 py-2">
<input
type="number"
value={editForm.no || 0}
onChange={(e) => setEditForm({ ...editForm, no: parseInt(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemgroup || ''}
onChange={(e) => setEditForm({ ...editForm, itemgroup: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="그룹"
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemname || ''}
onChange={(e) => setEditForm({ ...editForm, itemname: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="품명 *"
required
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemmodel || ''}
onChange={(e) => setEditForm({ ...editForm, itemmodel: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="모델"
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemscale || ''}
onChange={(e) => setEditForm({ ...editForm, itemscale: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="규격"
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemunit || ''}
onChange={(e) => setEditForm({ ...editForm, itemunit: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="단위"
/>
</td>
<td className="px-2 py-2 text-right">
<input
type="number"
value={editForm.qty || 0}
onChange={(e) => setEditForm({ ...editForm, qty: parseFloat(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
/>
</td>
<td className="px-2 py-2 text-right">
<input
type="number"
value={editForm.price || 0}
onChange={(e) => setEditForm({ ...editForm, price: parseFloat(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
/>
</td>
<td className="px-2 py-2 text-right">
<span className="text-white/90 text-xs font-medium">
{getAmount(editForm.qty || 0, editForm.price || 0).toLocaleString()}
</span>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemsupply || ''}
onChange={(e) => setEditForm({ ...editForm, itemsupply: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="공급처"
/>
</td>
<td className="px-2 py-2">
<div className="flex items-center justify-center gap-1">
<button
onClick={handleSave}
className="p-1 hover:bg-green-500/20 text-green-400 rounded transition-colors"
title="저장"
>
<Save className="w-4 h-4" />
</button>
<button
onClick={cancelEdit}
className="p-1 hover:bg-white/10 text-white/50 rounded transition-colors"
title="취소"
>
<X className="w-4 h-4" />
</button>
</div>
</td>
</tr>
)}
</tbody>
</table>
)}
</div>
{/* 합계 */}
{parts.length > 0 && (
<div className="p-4 border-t border-white/10 bg-slate-900/50">
<div className="flex justify-end gap-4 text-sm">
<span className="text-white/70">
<span className="text-white font-medium">{parts.length}</span>
</span>
<span className="text-white/70">
: <span className="text-primary-400 font-medium">
{parts.reduce((sum, part) => sum + getAmount(part.qty || 0, part.price || 0), 0).toLocaleString()}
</span>
</span>
</div>
</div>
)}
</div>
</div>
);
}

View File

@@ -1 +1,2 @@
export { ProjectDetailDialog } from './ProjectDetailDialog';
export { PartListDialog } from './PartListDialog';

View File

@@ -0,0 +1,774 @@
import { useState, useEffect } from 'react';
import { FileText, Search, RefreshCw, Calendar, Edit3, User, Plus } from 'lucide-react';
import { comms } from '@/communication';
import { BoardItem } from '@/types';
interface BoardListProps {
bidx: number;
title: string;
icon?: React.ReactNode;
defaultCategory?: string;
categories?: { value: string; label: string; color: string }[];
}
export function BoardList({
bidx,
title,
icon = <FileText className="w-5 h-5" />,
defaultCategory = 'PATCH',
categories = [
{ value: 'PATCH', label: 'PATCH', color: 'red' },
{ value: 'UPDATE', label: 'UPDATE', color: 'lime' }
]
}: BoardListProps) {
const [boardList, setBoardList] = useState<BoardItem[]>([]);
const [loading, setLoading] = useState(false);
const [searchKey, setSearchKey] = useState('');
const [selectedItem, setSelectedItem] = useState<BoardItem | null>(null);
const [showModal, setShowModal] = useState(false);
const [showEditModal, setShowEditModal] = useState(false);
const [showReplyModal, setShowReplyModal] = useState(false);
const [editFormData, setEditFormData] = useState<BoardItem | null>(null);
const [userLevel, setUserLevel] = useState(0);
const [userId, setUserId] = useState('');
const [replies, setReplies] = useState<BoardItem[]>([]); // 댓글 목록 (is_comment=true)
const [replyPosts, setReplyPosts] = useState<BoardItem[]>([]); // 답글 목록 (is_comment=false)
const [commentText, setCommentText] = useState('');
const [replyFormData, setReplyFormData] = useState<{ title: string; contents: string }>({ title: '', contents: '' });
useEffect(() => {
loadUserInfo();
loadData();
}, []);
// ESC 키 처리
useEffect(() => {
const handleEscKey = (e: KeyboardEvent) => {
if (e.key === 'Escape') {
if (showReplyModal) {
setShowReplyModal(false);
} else if (showEditModal) {
setShowEditModal(false);
} else if (showModal) {
setShowModal(false);
}
}
};
document.addEventListener('keydown', handleEscKey);
return () => document.removeEventListener('keydown', handleEscKey);
}, [showModal, showEditModal, showReplyModal]);
const loadUserInfo = async () => {
try {
const response = await comms.checkLoginStatus();
if (response.Success && response.User) {
setUserLevel(response.User.Level);
setUserId(response.User.Id);
}
} catch (error) {
console.error('사용자 정보 로드 오류:', error);
}
};
const loadData = async () => {
setLoading(true);
try {
console.log('게시판 조회:', { bidx, searchKey });
const response = await comms.getBoardList(bidx, searchKey);
console.log('게시판 응답:', response);
if (response.Success && response.Data) {
setBoardList(response.Data);
} else {
console.warn('게시판 없음:', response.Message);
setBoardList([]);
}
} catch (error) {
console.error('게시판 로드 오류:', error);
alert('데이터를 불러오는 중 오류가 발생했습니다.');
} finally {
setLoading(false);
}
};
const handleSearch = () => {
loadData();
};
const loadReplies = async (rootIdx: number) => {
try {
const response = await comms.getBoardReplies(rootIdx);
if (response.Success && response.Data) {
setReplies(response.Data);
} else {
setReplies([]);
}
} catch (error) {
console.error('댓글 로드 오류:', error);
setReplies([]);
}
};
const loadReplyPosts = async (rootIdx: number) => {
try {
// 목록에서 해당 root_idx의 답글들만 필터링
const replyList = boardList.filter(item => item.root_idx === rootIdx && !item.is_comment);
setReplyPosts(replyList);
} catch (error) {
console.error('답글 로드 오류:', error);
setReplyPosts([]);
}
};
const handleAddComment = async () => {
if (!selectedItem || !commentText.trim()) return;
try {
const response = await comms.addBoardReply(selectedItem.idx, selectedItem.idx, '', commentText, true);
if (response.Success) {
setCommentText('');
loadReplies(selectedItem.idx);
// reply_count 업데이트를 위해 목록 새로고침
loadData();
} else {
alert(response.Message || '댓글 등록에 실패했습니다.');
}
} catch (error) {
console.error('댓글 등록 오류:', error);
alert('댓글 등록 중 오류가 발생했습니다.');
}
};
const handleAddReply = async () => {
if (!selectedItem || !replyFormData.title.trim() || !replyFormData.contents.trim()) {
alert('제목과 내용을 입력해주세요.');
return;
}
try {
// 답글은 is_comment=false, title 포함
const rootIdx = selectedItem.root_idx || selectedItem.idx;
const response = await comms.addBoardReply(rootIdx, selectedItem.idx, replyFormData.title, replyFormData.contents, false);
if (response.Success) {
setShowReplyModal(false);
setReplyFormData({ title: '', contents: '' });
await loadData(); // 목록 새로고침
loadReplyPosts(rootIdx); // 답글 목록 새로고침
} else {
alert(response.Message || '답글 등록에 실패했습니다.');
}
} catch (error) {
console.error('답글 등록 오류:', error);
alert('답글 등록 중 오류가 발생했습니다.');
}
};
const handleRowClick = async (item: BoardItem) => {
try {
const response = await comms.getBoardDetail(item.idx);
if (response.Success && response.Data) {
setSelectedItem(response.Data);
const rootIdx = response.Data.root_idx || response.Data.idx;
loadReplies(rootIdx); // 댓글 로드
loadReplyPosts(rootIdx); // 답글 로드
setShowModal(true); // 모두 뷰어로 보기
}
} catch (error) {
console.error('상세 조회 오류:', error);
alert('데이터를 불러오는 중 오류가 발생했습니다.');
}
};
const handleEditClick = () => {
if (selectedItem) {
setEditFormData(selectedItem);
setShowModal(false);
setShowEditModal(true);
}
};
const handleEditSave = async () => {
if (!editFormData) return;
try {
const isNew = editFormData.idx === 0;
if (isNew) {
// 신규 등록
const response = await comms.addBoard(
bidx,
editFormData.header || '',
editFormData.cate || '',
editFormData.title || '',
editFormData.contents || ''
);
if (response.Success) {
setShowEditModal(false);
setEditFormData(null);
loadData();
} else {
alert(response.Message || '등록에 실패했습니다.');
}
} else {
// 수정
const response = await comms.editBoard(
editFormData.idx,
editFormData.header || '',
editFormData.cate || '',
editFormData.title || '',
editFormData.contents || ''
);
if (response.Success) {
setShowEditModal(false);
setEditFormData(null);
loadData();
} else {
alert(response.Message || '수정에 실패했습니다.');
}
}
} catch (error) {
console.error('저장 오류:', error);
alert('저장 중 오류가 발생했습니다.');
}
};
const handleDelete = async () => {
if (!editFormData || editFormData.idx === 0) return;
if (!confirm('정말 삭제하시겠습니까?')) return;
try {
const response = await comms.deleteBoard(editFormData.idx);
if (response.Success) {
setShowEditModal(false);
setEditFormData(null);
loadData();
} else {
alert(response.Message || '삭제에 실패했습니다.');
}
} catch (error) {
console.error('삭제 오류:', error);
alert('삭제 중 오류가 발생했습니다.');
}
};
const formatDate = (dateStr: string | null) => {
if (!dateStr) return '-';
try {
const date = new Date(dateStr);
const yy = String(date.getFullYear()).slice(-2);
const mm = String(date.getMonth() + 1).padStart(2, '0');
const dd = String(date.getDate()).padStart(2, '0');
return `${yy}.${mm}.${dd}`;
} catch {
return dateStr;
}
};
const isNew = (dateStr: string | null) => {
if (!dateStr) return false;
try {
const date = new Date(dateStr);
const now = new Date();
const diffTime = now.getTime() - date.getTime();
const diffDays = diffTime / (1000 * 60 * 60 * 24);
return diffDays <= 3;
} catch {
return false;
}
};
const getCategoryColor = (cate: string) => {
const category = categories.find(c => c.value.toUpperCase() === cate.toUpperCase());
if (!category) return 'bg-gray-500/20 text-gray-400';
switch (category.color) {
case 'lime': return 'bg-lime-500/20 text-lime-400';
case 'red': return 'bg-red-500/20 text-red-400';
case 'blue': return 'bg-blue-500/20 text-blue-400';
case 'yellow': return 'bg-yellow-500/20 text-yellow-400';
default: return 'bg-gray-500/20 text-gray-400';
}
};
return (
<div className="space-y-6 animate-fade-in">
{/* 검색 필터 */}
<div className="glass-effect rounded-2xl p-6">
<div className="flex items-center gap-4">
<div className="flex items-center gap-2 flex-1">
<label className="text-white/70 text-sm font-medium whitespace-nowrap"></label>
<input
type="text"
value={searchKey}
onChange={(e) => setSearchKey(e.target.value)}
onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
placeholder="제목, 내용, 작성자 등"
className="flex-1 h-10 bg-white/20 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
/>
</div>
<button
onClick={handleSearch}
disabled={loading}
className="h-10 bg-primary-500 hover:bg-primary-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center disabled:opacity-50"
>
{loading ? (
<RefreshCw className="w-4 h-4 mr-2 animate-spin" />
) : (
<Search className="w-4 h-4 mr-2" />
)}
</button>
<button
onClick={() => {
setEditFormData({
idx: 0,
bidx: bidx,
gcode: '',
header: '',
cate: defaultCategory,
title: '',
contents: '',
file: '',
guid: '',
url: '',
wuid: '',
wuid_name: '',
wdate: null,
project: '',
pidx: 0,
close: false,
remark: ''
});
setShowEditModal(true);
}}
disabled={!(userLevel >= 9 || userId === '395552')}
className="h-10 bg-green-500 hover:bg-green-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center disabled:opacity-30 disabled:cursor-not-allowed"
>
<Plus className="w-4 h-4 mr-2" />
</button>
</div>
</div>
{/* 게시판 목록 */}
<div className="glass-effect rounded-2xl overflow-hidden">
<div className="px-6 py-4 border-b border-white/10 flex items-center justify-between">
<h3 className="text-lg font-semibold text-white flex items-center">
{icon}
<span className="ml-2">{title}</span>
</h3>
<span className="text-white/60 text-sm">{boardList.length}</span>
</div>
<div className="divide-y divide-white/10 max-h-[calc(100vh-300px)] overflow-y-auto">
{loading ? (
<div className="px-6 py-8 text-center">
<div className="flex items-center justify-center">
<RefreshCw className="w-5 h-5 mr-2 animate-spin text-white/50" />
<span className="text-white/50"> ...</span>
</div>
</div>
) : boardList.length === 0 ? (
<div className="px-6 py-8 text-center">
<FileText className="w-12 h-12 mx-auto mb-3 text-white/30" />
<p className="text-white/50"> .</p>
</div>
) : (
boardList.map((item) => (
<div
key={item.idx}
className="px-6 py-3 hover:bg-white/5 transition-colors cursor-pointer"
onClick={() => handleRowClick(item)}
style={{ paddingLeft: `${24 + (item.depth || 0) * 24}px` }}
>
<div className="flex items-center gap-3">
<div className="flex items-center gap-2 flex-shrink-0">
{item.depth && item.depth > 0 && (
<span className="text-white/40 text-xs mr-1"></span>
)}
{item.cate && (
<span className={`px-2 py-0.5 text-xs rounded whitespace-nowrap ${getCategoryColor(item.cate)}`}>
{item.cate}
</span>
)}
{item.header && (
<span className="px-2 py-0.5 bg-primary-500/20 text-primary-400 text-xs rounded whitespace-nowrap">
{item.header}
</span>
)}
</div>
<div className="flex items-center text-white/60 text-xs flex-shrink-0 mr-3">
<Calendar className="w-3 h-3 mr-1" />
{formatDate(item.wdate)}
</div>
<h4 className="text-white font-medium flex-1 min-w-0 flex items-center gap-2">
<span className="truncate">{item.title || '(댓글)'}</span>
{isNew(item.wdate) && (
<span className="px-1.5 py-0.5 bg-yellow-500 text-white text-[10px] rounded font-bold animate-pulse flex-shrink-0">
NEW
</span>
)}
{(item.reply_count ?? 0) > 0 && (
<span className="px-1.5 py-0.5 bg-blue-500/20 text-blue-400 text-[10px] rounded flex-shrink-0">
💬 {item.reply_count}
</span>
)}
</h4>
<div className="flex items-center text-white/60 text-xs flex-shrink-0">
<User className="w-3 h-3 mr-1" />
{item.wuid_name || item.wuid}
</div>
</div>
</div>
))
)}
</div>
</div>
{/* 상세 모달 */}
{showModal && selectedItem && (
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
<div className="flex items-center gap-2">
{selectedItem.header && (
<span className="px-2 py-1 bg-primary-500/20 text-primary-400 text-sm rounded">
{selectedItem.header}
</span>
)}
{selectedItem.cate && (
<span className={`px-2 py-1 text-sm rounded ${getCategoryColor(selectedItem.cate)}`}>
{selectedItem.cate}
</span>
)}
<h2 className="text-xl font-bold text-white ml-2">{selectedItem.title}</h2>
</div>
<button
onClick={() => setShowModal(false)}
className="text-white/50 hover:text-white transition-colors"
>
<span className="text-2xl">×</span>
</button>
</div>
<div className="px-6 py-4 border-b border-white/10 flex items-center gap-4 text-sm text-white/60">
<div className="flex items-center">
<User className="w-4 h-4 mr-1" />
{selectedItem.wuid_name || selectedItem.wuid}
</div>
<div className="flex items-center">
<Calendar className="w-4 h-4 mr-1" />
{formatDate(selectedItem.wdate)}
</div>
</div>
<div className="overflow-y-auto max-h-[calc(90vh-400px)] p-6">
{selectedItem.contents && selectedItem.contents.trim() && (
<div className="prose prose-invert max-w-none mb-8">
<div className="text-white whitespace-pre-wrap">{selectedItem.contents}</div>
</div>
)}
{/* 답글 목록 */}
{replyPosts.length > 0 && (
<div className={selectedItem.contents && selectedItem.contents.trim() ? "border-t border-white/10 pt-6 mb-6" : "mb-6"}>
<h3 className="text-lg font-semibold text-white mb-4">
{replyPosts.length}
</h3>
<div className="space-y-3">
{replyPosts.map((replyPost) => (
<div
key={replyPost.idx}
className="bg-white/5 hover:bg-white/10 rounded-lg p-4 cursor-pointer transition-colors"
onClick={() => handleRowClick(replyPost)}
>
<div className="flex items-center justify-between mb-2">
<h4 className="text-white font-medium flex items-center gap-2">
{replyPost.depth && replyPost.depth > 0 && (
<span className="text-white/40 text-sm"></span>
)}
<span>{replyPost.title}</span>
{isNew(replyPost.wdate) && (
<span className="px-1.5 py-0.5 bg-yellow-500 text-white text-[10px] rounded font-bold">
NEW
</span>
)}
</h4>
<div className="flex items-center gap-3 text-xs text-white/60">
<div className="flex items-center">
<User className="w-3 h-3 mr-1" />
{replyPost.wuid_name || replyPost.wuid}
</div>
<div className="flex items-center">
<Calendar className="w-3 h-3 mr-1" />
{formatDate(replyPost.wdate)}
</div>
</div>
</div>
{replyPost.contents && (
<div className="text-white/60 text-sm line-clamp-2">
{replyPost.contents}
</div>
)}
</div>
))}
</div>
</div>
)}
{/* 댓글 목록 */}
<div className={(selectedItem.contents && selectedItem.contents.trim()) || replyPosts.length > 0 ? "border-t border-white/10 pt-6" : ""}>
<h3 className="text-lg font-semibold text-white mb-4">
{replies.length}
</h3>
<div className="space-y-4 mb-6">
{replies.map((reply) => (
<div key={reply.idx} className="bg-white/5 rounded-lg p-4">
<div className="flex items-center gap-2 mb-2">
<User className="w-4 h-4 text-white/60" />
<span className="text-sm text-white/80">{reply.wuid_name || reply.wuid}</span>
<span className="text-xs text-white/50">{formatDate(reply.wdate)}</span>
</div>
<div className="text-white/70 text-sm whitespace-pre-wrap">{reply.contents}</div>
</div>
))}
</div>
{/* 댓글 입력 */}
<div className="bg-white/5 rounded-lg p-4">
<textarea
value={commentText}
onChange={(e) => setCommentText(e.target.value)}
placeholder="댓글을 입력하세요..."
rows={3}
className="w-full bg-white/10 border border-white/30 rounded-lg px-3 py-2 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
/>
<div className="flex justify-end mt-2">
<button
onClick={handleAddComment}
disabled={!commentText.trim()}
className="px-4 py-2 bg-primary-500 hover:bg-primary-600 disabled:opacity-50 disabled:cursor-not-allowed text-white rounded-lg transition-colors"
>
</button>
</div>
</div>
</div>
</div>
<div className="flex items-center justify-between px-6 py-4 border-t border-white/10 bg-white/5">
<div className="flex items-center gap-2">
<button
onClick={() => setShowReplyModal(true)}
className="px-4 py-2 rounded-lg bg-green-500 hover:bg-green-600 text-white transition-colors"
>
</button>
</div>
<div className="flex items-center gap-2">
{(userLevel >= 9 || userId === '395552') && (
<>
<button
onClick={handleEditClick}
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors flex items-center"
>
<Edit3 className="w-4 h-4 mr-2" />
</button>
<button
onClick={async () => {
if (!selectedItem) return;
if (!confirm('정말 삭제하시겠습니까?')) return;
try {
const response = await comms.deleteBoard(selectedItem.idx);
if (response.Success) {
setShowModal(false);
loadData();
} else {
alert(response.Message || '삭제에 실패했습니다.');
}
} catch (error) {
console.error('삭제 오류:', error);
alert('삭제 중 오류가 발생했습니다.');
}
}}
className="px-4 py-2 rounded-lg bg-red-500 hover:bg-red-600 text-white transition-colors"
>
</button>
</>
)}
<button
onClick={() => setShowModal(false)}
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
>
</button>
</div>
</div>
</div>
</div>
)}
{/* 편집 모달 */}
{showEditModal && editFormData && (
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
<h2 className="text-xl font-bold text-white flex items-center">
<Edit3 className="w-5 h-5 mr-2" />
{editFormData.idx === 0 ? `${title} 등록` : `${title} 편집`}
</h2>
<button
onClick={() => setShowEditModal(false)}
className="text-white/50 hover:text-white transition-colors"
>
<span className="text-2xl">×</span>
</button>
</div>
<div className="overflow-y-auto max-h-[calc(90vh-180px)] p-6 space-y-4">
<div className="flex items-center gap-3">
<div className="w-32">
<label className="block text-white/70 text-xs font-medium mb-1"></label>
<select
value={editFormData.cate || defaultCategory}
onChange={(e) => setEditFormData({ ...editFormData, cate: e.target.value })}
className="w-full h-9 bg-white/10 border border-white/30 rounded-lg px-2 text-white text-sm focus:outline-none focus:ring-2 focus:ring-primary-400"
>
{categories.map((cat) => (
<option key={cat.value} value={cat.value} className="bg-gray-800">
{cat.label}
</option>
))}
</select>
</div>
<div className="flex-1">
<label className="block text-white/70 text-xs font-medium mb-1"></label>
<input
type="text"
value={editFormData.title || ''}
onChange={(e) => setEditFormData({ ...editFormData, title: e.target.value })}
className="w-full h-9 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
placeholder="제목"
/>
</div>
</div>
<div>
<label className="block text-white/70 text-sm font-medium mb-2"></label>
<textarea
value={editFormData.contents || ''}
onChange={(e) => setEditFormData({ ...editFormData, contents: e.target.value })}
rows={15}
className="w-full bg-white/10 border border-white/30 rounded-lg px-3 py-2 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
placeholder="내용을 입력하세요..."
/>
</div>
</div>
<div className="flex items-center justify-between px-6 py-4 border-t border-white/10 bg-white/5">
<div>
{editFormData && editFormData.idx > 0 && (
<button
onClick={handleDelete}
className="px-4 py-2 rounded-lg bg-red-500 hover:bg-red-600 text-white transition-colors"
>
</button>
)}
</div>
<div className="flex items-center gap-2">
<button
onClick={() => setShowEditModal(false)}
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
>
</button>
<button
onClick={handleEditSave}
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors"
>
</button>
</div>
</div>
</div>
</div>
)}
{/* 답글 달기 모달 */}
{showReplyModal && selectedItem && (
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
<h2 className="text-xl font-bold text-white flex items-center">
<Edit3 className="w-5 h-5 mr-2" />
</h2>
<button
onClick={() => setShowReplyModal(false)}
className="text-white/50 hover:text-white transition-colors"
>
<span className="text-2xl">×</span>
</button>
</div>
<div className="overflow-y-auto max-h-[calc(90vh-180px)] p-6 space-y-4">
<div className="bg-white/5 rounded-lg p-4 mb-4">
<div className="text-sm text-white/60 mb-2"></div>
<div className="text-white font-medium">{selectedItem.title}</div>
</div>
<div>
<label className="block text-white/70 text-sm font-medium mb-2"> </label>
<input
type="text"
value={replyFormData.title}
onChange={(e) => setReplyFormData({ ...replyFormData, title: e.target.value })}
className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
placeholder="답글 제목을 입력하세요"
/>
</div>
<div>
<label className="block text-white/70 text-sm font-medium mb-2"> </label>
<textarea
value={replyFormData.contents}
onChange={(e) => setReplyFormData({ ...replyFormData, contents: e.target.value })}
rows={15}
className="w-full bg-white/10 border border-white/30 rounded-lg px-3 py-2 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
placeholder="답글 내용을 입력하세요..."
/>
</div>
</div>
<div className="flex items-center justify-end gap-2 px-6 py-4 border-t border-white/10 bg-white/5">
<button
onClick={() => setShowReplyModal(false)}
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
>
</button>
<button
onClick={handleAddReply}
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors"
>
</button>
</div>
</div>
</div>
)}
</div>
);
}

View File

@@ -0,0 +1,18 @@
import { BoardList } from './BoardList';
import { Bug } from 'lucide-react';
export function BugReport() {
return (
<BoardList
bidx={2}
title="버그 신고"
icon={<Bug className="w-5 h-5" />}
defaultCategory="BUG"
categories={[
{ value: 'BUG', label: 'BUG', color: 'red' },
{ value: 'FIXED', label: 'FIXED', color: 'lime' },
{ value: 'PENDING', label: 'PENDING', color: 'yellow' }
]}
/>
);
}

View File

@@ -61,9 +61,13 @@ export function Dashboard() {
const [purchaseCR, setPurchaseCR] = useState(0);
const [todoCount, setTodoCount] = useState(0);
const [todayWorkHrs, setTodayWorkHrs] = useState(0);
const [unregisteredJobReportCount, setUnregisteredJobReportCount] = useState(0);
const [unregisteredJobReportDays, setUnregisteredJobReportDays] = useState<{ date: string; hrs: number }[]>([]);
// 목록 데이터
const [urgentTodos, setUrgentTodos] = useState<TodoModel[]>([]);
const [allUrgentTodos, setAllUrgentTodos] = useState<TodoModel[]>([]); // 전체 할일 목록
const [todoPage, setTodoPage] = useState(1); // 할일 페이지
const [purchaseNRList, setPurchaseNRList] = useState<PurchaseItem[]>([]);
const [purchaseCRList, setPurchaseCRList] = useState<PurchaseItem[]>([]);
const [recentNotes, setRecentNotes] = useState<NoteItem[]>([]);
@@ -71,6 +75,7 @@ export function Dashboard() {
// 모달 상태
const [showNRModal, setShowNRModal] = useState(false);
const [showCRModal, setShowCRModal] = useState(false);
const [showUnregisteredModal, setShowUnregisteredModal] = useState(false);
const [showNoteModal, setShowNoteModal] = useState(false);
const [showNoteEditModal, setShowNoteEditModal] = useState(false);
const [showNoteAddModal, setShowNoteAddModal] = useState(false);
@@ -92,12 +97,42 @@ export function Dashboard() {
status: '0' as TodoStatus,
});
// 할일 페이지 변경 시 목록 업데이트
useEffect(() => {
const start = (todoPage - 1) * 6;
const end = start + 6;
setUrgentTodos(allUrgentTodos.slice(start, end));
}, [todoPage, allUrgentTodos]);
// ESC 키로 모달 닫기
useEffect(() => {
const handleEscape = (e: KeyboardEvent) => {
if (e.key === 'Escape') {
if (showTodoAddModal) {
setShowTodoAddModal(false);
} else if (showTodoEditModal) {
setShowTodoEditModal(false);
}
}
};
if (showTodoAddModal || showTodoEditModal) {
document.addEventListener('keydown', handleEscape);
return () => document.removeEventListener('keydown', handleEscape);
}
}, [showTodoAddModal, showTodoEditModal]);
const loadDashboardData = useCallback(async () => {
try {
// 오늘 날짜 (로컬 시간 기준)
const now = new Date();
const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
// 15일 전 날짜 계산
const fifteenDaysAgoDate = new Date(now);
fifteenDaysAgoDate.setDate(now.getDate() - 15);
const fifteenDaysAgoStr = `${fifteenDaysAgoDate.getFullYear()}-${String(fifteenDaysAgoDate.getMonth() + 1).padStart(2, '0')}-${String(fifteenDaysAgoDate.getDate()).padStart(2, '0')}`;
// 현재 로그인 사용자 ID 가져오기
let currentUserId = '';
try {
@@ -115,12 +150,14 @@ export function Dashboard() {
urgentTodosResponse,
allTodosResponse,
jobreportResponse,
jobreportHistoryResponse,
notesResponse,
] = await Promise.all([
comms.getPurchaseWaitCount(),
comms.getUrgentTodos(),
comms.getTodos(),
comms.getJobReportList(todayStr, todayStr, currentUserId, ''),
comms.getJobReportList(fifteenDaysAgoStr, todayStr, currentUserId, ''),
comms.getNoteList('2000-01-01', todayStr, ''),
]);
@@ -128,7 +165,9 @@ export function Dashboard() {
setPurchaseCR(purchaseCount.CR);
if (urgentTodosResponse.Success && urgentTodosResponse.Data) {
setUrgentTodos(urgentTodosResponse.Data.slice(0, 5));
setAllUrgentTodos(urgentTodosResponse.Data);
setUrgentTodos(urgentTodosResponse.Data.slice(0, 6));
setTodoPage(1);
}
if (allTodosResponse.Success && allTodosResponse.Data) {
@@ -145,6 +184,39 @@ export function Dashboard() {
setTodayWorkHrs(0);
}
// 최근 15일간 업무일지 미등록(8시간 미만) 확인
if (jobreportHistoryResponse.Success && jobreportHistoryResponse.Data) {
const dailyWork: { [key: string]: number } = {};
// 날짜별 시간 합계 계산
jobreportHistoryResponse.Data.forEach((item: JobReportItem) => {
if (item.pdate) {
const date = item.pdate.substring(0, 10);
dailyWork[date] = (dailyWork[date] || 0) + (item.hrs || 0);
}
});
const insufficientDays: { date: string; hrs: number }[] = [];
// 어제부터 15일 전까지 확인 (오늘은 제외)
for (let i = 1; i <= 15; i++) {
const d = new Date(now);
d.setDate(now.getDate() - i);
const dStr = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
// 주말(토:6, 일:0) 제외
if (d.getDay() === 0 || d.getDay() === 6) continue;
const hrs = dailyWork[dStr] || 0;
if (hrs < 8) {
insufficientDays.push({ date: dStr, hrs });
}
}
setUnregisteredJobReportCount(insufficientDays.length);
setUnregisteredJobReportDays(insufficientDays);
}
// 최근 메모 목록 (최대 10개)
if (notesResponse.Success && notesResponse.Data) {
setRecentNotes(notesResponse.Data.slice(0, 10));
@@ -214,6 +286,7 @@ export function Dashboard() {
const getPriorityText = (seqno: number) => {
switch (seqno) {
case -1: return '낮음';
case 1: return '중요';
case 2: return '매우 중요';
case 3: return '긴급';
@@ -223,6 +296,7 @@ export function Dashboard() {
const getPriorityClass = (seqno: number) => {
switch (seqno) {
case -1: return 'bg-white/5 text-white/40';
case 1: return 'bg-primary-500/20 text-primary-300';
case 2: return 'bg-warning-500/20 text-warning-300';
case 3: return 'bg-danger-500/20 text-danger-300';
@@ -494,7 +568,7 @@ export function Dashboard() {
</div>
{/* 통계 카드 */}
<div className="grid grid-cols-1 md:grid-cols-4 gap-6">
<div className="grid grid-cols-1 md:grid-cols-5 gap-6">
<StatCard
title="구매요청 (NR)"
value={purchaseNR}
@@ -516,6 +590,13 @@ export function Dashboard() {
color="text-warning-400"
onClick={() => navigate('/todo')}
/>
<StatCard
title="업무일지 미등록"
value={`${unregisteredJobReportCount}`}
icon={<AlertTriangle className="w-6 h-6 text-danger-400" />}
color="text-danger-400"
onClick={() => setShowUnregisteredModal(true)}
/>
<StatCard
title="금일 업무일지"
value={`${todayWorkHrs}시간`}
@@ -559,20 +640,25 @@ export function Dashboard() {
onClick={() => handleTodoEdit(todo)}
>
<div className="flex items-center justify-between">
<div className="flex items-center space-x-4">
<div className="flex items-center space-x-4 flex-1 min-w-0">
{todo.flag && (
<Flag className="w-4 h-4 text-warning-400" />
<Flag className="w-4 h-4 text-warning-400 flex-shrink-0" />
)}
<div>
<div className="flex-1 min-w-0">
<p className="text-white font-medium">
{todo.request && (
<span className="text-xs text-primary-400 mr-2">
({todo.request})
</span>
)}
{todo.title || '제목 없음'}
</p>
<p className="text-white/60 text-sm line-clamp-1">
<p className="text-white/60 text-sm line-clamp-1 mt-1">
{todo.remark}
</p>
</div>
</div>
<div className="flex items-center space-x-3">
<div className="flex items-center space-x-3 flex-shrink-0 ml-4">
<span className={`px-2 py-1 rounded-full text-xs font-medium ${getPriorityClass(todo.seqno)}`}>
{getPriorityText(todo.seqno)}
</span>
@@ -595,8 +681,94 @@ export function Dashboard() {
</div>
)}
</div>
{allUrgentTodos.length > 6 && (
<div className="px-6 py-3 border-t border-white/10 flex items-center justify-between">
<span className="text-xs text-white/50">
{(todoPage - 1) * 6 + 1}-{Math.min(todoPage * 6, allUrgentTodos.length)} / {allUrgentTodos.length}
</span>
<div className="flex gap-1">
<button
onClick={() => setTodoPage(p => Math.max(1, p - 1))}
disabled={todoPage === 1}
className="px-2 py-1 rounded bg-white/10 hover:bg-white/20 text-white/70 disabled:opacity-30 disabled:cursor-not-allowed transition-colors text-xs"
>
</button>
<button
onClick={() => setTodoPage(p => Math.min(Math.ceil(allUrgentTodos.length / 6), p + 1))}
disabled={todoPage >= Math.ceil(allUrgentTodos.length / 6)}
className="px-2 py-1 rounded bg-white/10 hover:bg-white/20 text-white/70 disabled:opacity-30 disabled:cursor-not-allowed transition-colors text-xs"
>
</button>
</div>
</div>
)}
</div>
{/* 업무일지 미등록 상세 모달 */}
{showUnregisteredModal && (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm p-4">
<div className="bg-slate-900 border border-white/10 rounded-2xl w-full max-w-md shadow-2xl overflow-hidden animate-scale-in">
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10 bg-white/5">
<h3 className="text-lg font-semibold text-white flex items-center gap-2">
<AlertTriangle className="w-5 h-5 text-danger-400" />
</h3>
<button
onClick={() => setShowUnregisteredModal(false)}
className="text-white/50 hover:text-white transition-colors"
>
<X className="w-5 h-5" />
</button>
</div>
<div className="p-6 max-h-[60vh] overflow-y-auto">
<p className="text-white/70 text-sm mb-4">
15( ) 8 .
</p>
{unregisteredJobReportDays.length === 0 ? (
<div className="text-center py-8 text-white/50">
.
</div>
) : (
<div className="space-y-2">
{unregisteredJobReportDays.map((day, index) => (
<div key={index} className="flex items-center justify-between p-3 bg-white/5 rounded-lg border border-white/5">
<div className="flex items-center gap-3">
<div className="w-8 h-8 rounded-full bg-danger-500/20 flex items-center justify-center text-danger-400 text-xs font-bold">
{index + 1}
</div>
<span className="text-white font-medium">{day.date}</span>
</div>
<div className="flex items-center gap-2">
<span className={`font-bold ${day.hrs === 0 ? 'text-danger-400' : 'text-warning-400'}`}>
{day.hrs}
</span>
<span className="text-white/40 text-xs">/ 8</span>
</div>
</div>
))}
</div>
)}
</div>
<div className="px-6 py-4 border-t border-white/10 bg-white/5 flex justify-end">
<button
onClick={() => {
setShowUnregisteredModal(false);
navigate('/jobreport');
}}
className="px-4 py-2 bg-primary-500 hover:bg-primary-600 text-white rounded-lg transition-colors text-sm font-medium"
>
</button>
</div>
</div>
</div>
)}
{/* NR 모달 */}
{showNRModal && (
<Modal title="구매요청 (NR) 목록" onClose={() => setShowNRModal(false)}>
@@ -743,10 +915,11 @@ export function Dashboard() {
onChange={(e) => setTodoFormData(prev => ({ ...prev, seqno: parseInt(e.target.value) as TodoPriority }))}
className="w-full bg-white/20 backdrop-blur-sm border border-white/30 rounded-lg px-4 py-2 text-white focus:outline-none focus:ring-2 focus:ring-primary-400 transition-all"
>
<option value={0}></option>
<option value={1}></option>
<option value={2}> </option>
<option value={3}></option>
<option value={2}> </option>
<option value={1}></option>
<option value={0}></option>
<option value={-1}></option>
</select>
</div>
<div className="flex items-end">
@@ -805,9 +978,22 @@ export function Dashboard() {
<Edit2 className="w-5 h-5 mr-2" />
</h2>
<button onClick={() => setShowTodoEditModal(false)} className="text-white/70 hover:text-white transition-colors">
<X className="w-6 h-6" />
</button>
<div className="flex items-center space-x-2">
{editingTodo.status !== '5' && (
<button
type="button"
onClick={handleTodoComplete}
disabled={processing}
className="bg-success-500 hover:bg-success-600 text-white px-3 py-1.5 rounded-lg transition-colors flex items-center disabled:opacity-50 text-sm"
>
<CheckCircle className="w-4 h-4 mr-1" />
</button>
)}
<button onClick={() => setShowTodoEditModal(false)} className="text-white/70 hover:text-white transition-colors">
<X className="w-6 h-6" />
</button>
</div>
</div>
{/* 내용 */}
@@ -890,10 +1076,11 @@ export function Dashboard() {
onChange={(e) => setTodoFormData(prev => ({ ...prev, seqno: parseInt(e.target.value) as TodoPriority }))}
className="w-full bg-white/20 backdrop-blur-sm border border-white/30 rounded-lg px-4 py-2 text-white focus:outline-none focus:ring-2 focus:ring-primary-400 transition-all"
>
<option value={0}></option>
<option value={1}></option>
<option value={2}> </option>
<option value={3}></option>
<option value={2}> </option>
<option value={1}></option>
<option value={0}></option>
<option value={-1}></option>
</select>
</div>
<div className="flex items-end">
@@ -911,40 +1098,8 @@ export function Dashboard() {
</div>
{/* 푸터 */}
<div className="px-6 py-4 border-t border-white/10 flex justify-between">
{/* 왼쪽: 삭제 버튼 */}
<div>
<button
type="button"
onClick={handleTodoDelete}
disabled={processing}
className="bg-danger-500 hover:bg-danger-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
>
<Trash2 className="w-4 h-4 mr-2" />
</button>
</div>
{/* 오른쪽: 취소, 완료, 수정 버튼 */}
<div className="px-6 py-4 border-t border-white/10 flex justify-end">
<div className="flex space-x-3">
<button
type="button"
onClick={() => setShowTodoEditModal(false)}
className="bg-white/20 hover:bg-white/30 text-white px-4 py-2 rounded-lg transition-colors"
>
</button>
{editingTodo.status !== '5' && (
<button
type="button"
onClick={handleTodoComplete}
disabled={processing}
className="bg-success-500 hover:bg-success-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
>
<CheckCircle className="w-4 h-4 mr-2" />
</button>
)}
<button
type="button"
onClick={handleTodoUpdate}
@@ -958,6 +1113,15 @@ export function Dashboard() {
)}
</button>
<button
type="button"
onClick={handleTodoDelete}
disabled={processing}
className="bg-danger-500 hover:bg-danger-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
>
<Trash2 className="w-4 h-4 mr-2" />
</button>
</div>
</div>
</div>

View File

@@ -0,0 +1,374 @@
import { useState, useEffect, useCallback } from 'react';
import { Calendar, Search, User, RefreshCw, ChevronLeft, ChevronRight, Plus } from 'lucide-react';
import { comms } from '../communication';
import { HolidayRequest, HolidayRequestSummary } from '../types';
import { HolidayRequestDialog } from '../components/holiday/HolidayRequestDialog';
export default function HolidayRequestPage() {
const [loading, setLoading] = useState(false);
const [requests, setRequests] = useState<HolidayRequest[]>([]);
const [summary, setSummary] = useState<HolidayRequestSummary>({
ApprovedDays: 0,
ApprovedTimes: 0,
PendingDays: 0,
PendingTimes: 0
});
// 필터 상태
const [startDate, setStartDate] = useState('');
const [endDate, setEndDate] = useState('');
const [selectedUserId, setSelectedUserId] = useState('%');
const [userLevel, setUserLevel] = useState(0);
const [currentUserId, setCurrentUserId] = useState('');
const [currentUserName, setCurrentUserName] = useState('');
// 사용자 목록
const [users, setUsers] = useState<Array<{id: string, name: string}>>([]);
// Dialog State
const [isDialogOpen, setIsDialogOpen] = useState(false);
const [selectedRequest, setSelectedRequest] = useState<HolidayRequest | null>(null);
useEffect(() => {
// 초기 날짜 설정: 1개월 전 ~ 1개월 후
const today = new Date();
const oneMonthAgo = new Date(today);
oneMonthAgo.setMonth(today.getMonth() - 1);
const oneMonthLater = new Date(today);
oneMonthLater.setMonth(today.getMonth() + 1);
setStartDate(formatDate(oneMonthAgo));
setEndDate(formatDate(oneMonthLater));
// 사용자 정보 로드
loadUserInfo();
}, []);
useEffect(() => {
if (startDate && endDate && currentUserId) {
loadData();
}
}, [startDate, endDate, selectedUserId, currentUserId]);
const formatDate = (date: Date) => {
return date.toISOString().split('T')[0];
};
const formatDateShort = (dateStr?: string) => {
if (!dateStr) return '-';
const d = dateStr.substring(0, 10);
if (d.length < 10) return d;
return `${d.substring(2, 4)}-${d.substring(5, 7)}-${d.substring(8, 10)}`;
};
const loadUserInfo = async () => {
try {
// 사용자 정보 조회
const loginStatus = await comms.checkLoginStatus();
if (loginStatus.Success && loginStatus.IsLoggedIn && loginStatus.User) {
const user = loginStatus.User as { Level?: number; Id?: string; NameK?: string; Name?: string };
setCurrentUserId(user.Id || '');
setCurrentUserName(user.NameK || user.Name || '');
setUserLevel(user.Level || 0);
// 사용자 목록 로드
loadUsers(user.Level || 0);
}
} catch (error) {
console.error('Failed to load user info:', error);
}
};
const loadUsers = async (level: number) => {
try {
// 레벨 5 이상만 사용자 목록 조회 가능
if (level >= 5) {
const userList = await comms.getUserList('');
if (userList && userList.length > 0) {
const mappedUsers = userList.map((u: any) => ({
id: u.id || u.Id,
name: u.name || u.NameK || u.id
}));
setUsers([{ id: '%', name: '전체' }, ...mappedUsers]);
}
}
} catch (error) {
console.error('Failed to load users:', error);
}
};
const loadData = useCallback(async () => {
if (!startDate || !endDate) return;
setLoading(true);
try {
const userId = userLevel < 5 ? currentUserId : selectedUserId;
const response = await comms.getHolidayRequestList(startDate, endDate, userId, userLevel);
if (response.Success && response.Data) {
setRequests(response.Data);
// Summary는 별도 필드로 올 수 있음
const data = response as any;
if (data.Summary) {
setSummary(data.Summary);
}
}
} catch (error) {
console.error('Failed to load holiday requests:', error);
alert('데이터를 불러오는 중 오류가 발생했습니다.');
} finally {
setLoading(false);
}
}, [startDate, endDate, selectedUserId, userLevel, currentUserId]);
// 월 이동
const moveMonth = (offset: number) => {
const current = new Date(startDate);
current.setMonth(current.getMonth() + offset);
const year = current.getFullYear();
const month = current.getMonth();
const newStart = new Date(year, month, 1);
const newEnd = new Date(year, month + 1, 0);
setStartDate(formatDate(newStart));
setEndDate(formatDate(newEnd));
};
const getCategoryName = (cate: string) => {
const categories: { [key: string]: string } = {
'1': '연차',
'2': '반차',
'3': '병가',
'4': '경조사',
'5': '외출',
'6': '기타'
};
return categories[cate] || cate;
};
const getConfirmStatusText = (conf: number) => {
return conf === 1 ? '승인' : '미승인';
};
return (
<div className="flex flex-col h-full bg-gradient-to-br from-slate-50 via-blue-50/30 to-slate-50">
{/* 헤더 */}
<div className="glass-effect-solid border-b border-white/20">
<div className="flex items-center justify-between px-6 py-4">
<div className="flex items-center space-x-3">
<div className="p-2 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl shadow-lg">
<Calendar className="w-5 h-5 text-white" />
</div>
<div>
<h1 className="text-xl font-bold text-white">/ </h1>
<p className="text-sm text-white/70">Holiday Request Management</p>
</div>
</div>
<div className="flex items-center gap-2">
<button
onClick={() => {
setSelectedRequest(null);
setIsDialogOpen(true);
}}
className="flex items-center gap-2 px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-lg transition-all shadow-lg hover:shadow-blue-500/30"
>
<Plus className="w-4 h-4" />
<span className="text-sm font-medium"></span>
</button>
<button
onClick={loadData}
disabled={loading}
className="flex items-center gap-2 px-4 py-2 glass-effect-solid hover:bg-white/20 rounded-lg transition-all text-white disabled:opacity-50"
>
<RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />
<span className="text-sm font-medium"></span>
</button>
</div>
</div>
</div>
{/* 필터 영역 */}
<div className="glass-effect-solid border-b border-white/20">
<div className="px-6 py-4">
<div className="flex items-center gap-4 flex-wrap">
{/* 월 이동 버튼 */}
<div className="flex items-center gap-2">
<button
onClick={() => moveMonth(-1)}
className="p-2 glass-effect hover:bg-white/30 rounded-lg transition-all"
>
<ChevronLeft className="w-4 h-4 text-white" />
</button>
<div className="flex items-center gap-2">
<Calendar className="w-4 h-4 text-white/80" />
<input
type="date"
value={startDate}
onChange={(e) => setStartDate(e.target.value)}
className="px-3 py-2 glass-effect text-white text-sm rounded-lg focus:ring-2 focus:ring-blue-400/50 focus:outline-none"
/>
<span className="text-white/60">~</span>
<input
type="date"
value={endDate}
onChange={(e) => setEndDate(e.target.value)}
className="px-3 py-2 glass-effect text-white text-sm rounded-lg focus:ring-2 focus:ring-blue-400/50 focus:outline-none"
/>
</div>
<button
onClick={() => moveMonth(1)}
className="p-2 glass-effect hover:bg-white/30 rounded-lg transition-all"
>
<ChevronRight className="w-4 h-4 text-white" />
</button>
</div>
{/* 담당자 선택 (레벨 5 이상만) */}
{userLevel >= 5 && (
<div className="flex items-center gap-2">
<User className="w-4 h-4 text-white/80" />
<select
value={selectedUserId}
onChange={(e) => setSelectedUserId(e.target.value)}
className="px-3 py-2 glass-effect text-white text-sm rounded-lg focus:ring-2 focus:ring-blue-400/50 focus:outline-none"
>
{users.map(user => (
<option key={user.id} value={user.id}>{user.name}</option>
))}
</select>
</div>
)}
{/* 조회 버튼 */}
<button
onClick={loadData}
disabled={loading}
className="flex items-center gap-2 px-4 py-2 bg-gradient-to-r from-blue-500 to-blue-600 hover:from-blue-600 hover:to-blue-700 text-white text-sm font-medium rounded-lg shadow-lg transition-all disabled:opacity-50"
>
<Search className="w-4 h-4" />
</button>
</div>
{/* 합계 표시 */}
<div className="mt-4 flex gap-6 text-sm">
<div className="glass-effect px-4 py-2 rounded-lg">
<span className="font-medium text-white/90">() = </span>
<span className="text-blue-300 font-semibold">: {summary.ApprovedDays}</span>
<span className="mx-1 text-white/60">/</span>
<span className={summary.PendingDays === 0 ? 'text-white/90' : 'text-red-400 font-semibold'}>
: {summary.PendingDays}
</span>
</div>
<div className="glass-effect px-4 py-2 rounded-lg">
<span className="font-medium text-white/90">() = </span>
<span className="text-blue-300 font-semibold">: {summary.ApprovedTimes}</span>
<span className="mx-1 text-white/60">/</span>
<span className={summary.PendingTimes === 0 ? 'text-white/90' : 'text-red-400 font-semibold'}>
: {summary.PendingTimes}
</span>
</div>
</div>
</div>
</div>
{/* 테이블 */}
<div className="flex-1 overflow-auto px-6 py-4">
<div className="glass-effect-solid rounded-xl overflow-hidden">
<div className="overflow-x-auto">
<table className="w-full text-sm">
<thead>
<tr className="border-b border-white/10">
<th className="px-4 py-3 text-left font-semibold text-white/90">No</th>
<th className="px-4 py-3 text-left font-semibold text-white/90"></th>
<th className="px-4 py-3 text-left font-semibold text-white/90"></th>
<th className="px-4 py-3 text-left font-semibold text-white/90"></th>
<th className="px-4 py-3 text-left font-semibold text-white/90"></th>
<th className="px-4 py-3 text-left font-semibold text-white/90"></th>
<th className="px-4 py-3 text-left font-semibold text-white/90"></th>
<th className="px-4 py-3 text-center font-semibold text-white/90"></th>
<th className="px-4 py-3 text-center font-semibold text-white/90"></th>
<th className="px-4 py-3 text-left font-semibold text-white/90"></th>
<th className="px-4 py-3 text-center font-semibold text-white/90"></th>
</tr>
</thead>
<tbody>
{loading ? (
<tr>
<td colSpan={11} className="px-4 py-12 text-center">
<div className="flex items-center justify-center gap-3">
<RefreshCw className="w-5 h-5 text-blue-400 animate-spin" />
<span className="text-white/60"> ...</span>
</div>
</td>
</tr>
) : requests.length === 0 ? (
<tr>
<td colSpan={11} className="px-4 py-12 text-center">
<div className="flex flex-col items-center justify-center gap-3">
<Calendar className="w-12 h-12 text-white/30" />
<span className="text-white/60"> .</span>
</div>
</td>
</tr>
) : (
requests.map((req, index) => (
<tr
key={req.idx}
className="border-b border-white/5 hover:bg-white/5 transition-colors cursor-pointer"
onClick={() => {
setSelectedRequest(req);
setIsDialogOpen(true);
}}
>
<td className="px-4 py-3 text-white/70">{index + 1}</td>
<td className="px-4 py-3 text-white/90">{formatDateShort(req.wdate)}</td>
<td className="px-4 py-3 text-white/80">{req.dept || ''}</td>
<td className="px-4 py-3 text-white font-medium">{req.name || ''}</td>
<td className="px-4 py-3">
<span className="px-2 py-1 bg-blue-500/20 text-blue-300 rounded text-xs font-medium">
{getCategoryName(req.cate)}
</span>
</td>
<td className="px-4 py-3 text-white/90">{formatDateShort(req.sdate)}</td>
<td className="px-4 py-3 text-white/90">{formatDateShort(req.edate)}</td>
<td className="px-4 py-3 text-center text-white/90">{req.HolyDays || 0}</td>
<td className="px-4 py-3 text-center text-white/90">{req.HolyTimes || 0}</td>
<td className="px-4 py-3 text-white/70 max-w-xs truncate" title={req.HolyReason || ''}>
{req.HolyReason || '-'}
</td>
<td className="px-4 py-3 text-center">
<span className={`px-2 py-1 rounded text-xs font-semibold ${
req.conf === 1
? 'bg-green-500/20 text-green-300'
: 'bg-red-500/20 text-red-300'
}`}>
{getConfirmStatusText(req.conf)}
</span>
</td>
</tr>
))
)}
</tbody>
</table>
</div>
</div>
</div>
{/* 다이얼로그 */}
<HolidayRequestDialog
isOpen={isDialogOpen}
onClose={() => setIsDialogOpen(false)}
onSave={() => {
setIsDialogOpen(false);
loadData();
}}
initialData={selectedRequest}
currentUserName={currentUserName}
currentUserId={currentUserId}
userLevel={userLevel}
/>
</div>
);
}

View File

@@ -4,8 +4,11 @@ import {
Search,
RefreshCw,
Copy,
Info,
Plus,
Calendar,
AlertTriangle,
X,
} from 'lucide-react';
import { comms } from '@/communication';
import { JobReportItem, JobReportUser } from '@/types';
@@ -42,6 +45,11 @@ export function Jobreport() {
// 오늘 근무시간 상태
const [todayWork, setTodayWork] = useState({ hrs: 0, ot: 0 });
// 미등록 업무일지 상태
const [unregisteredJobReportCount, setUnregisteredJobReportCount] = useState(0);
const [unregisteredJobReportDays, setUnregisteredJobReportDays] = useState<{ date: string; hrs: number }[]>([]);
const [showUnregisteredModal, setShowUnregisteredModal] = useState(false);
// 날짜 포맷 헬퍼 함수 (로컬 시간 기준)
const formatDateLocal = (date: Date) => {
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
@@ -69,6 +77,55 @@ export function Jobreport() {
}
}, []);
// 미등록 업무일지 로드
const loadUnregisteredJobReports = useCallback(async (userId: string) => {
try {
const now = new Date();
const todayStr = formatDateLocal(now);
// 15일 전 날짜 계산
const fifteenDaysAgoDate = new Date(now);
fifteenDaysAgoDate.setDate(now.getDate() - 15);
const fifteenDaysAgoStr = formatDateLocal(fifteenDaysAgoDate);
const response = await comms.getJobReportList(fifteenDaysAgoStr, todayStr, userId, '');
if (response.Success && response.Data) {
const dailyWork: { [key: string]: number } = {};
// 날짜별 시간 합계 계산
response.Data.forEach((item: JobReportItem) => {
if (item.pdate) {
const date = item.pdate.substring(0, 10);
dailyWork[date] = (dailyWork[date] || 0) + (item.hrs || 0);
}
});
const insufficientDays: { date: string; hrs: number }[] = [];
// 어제부터 15일 전까지 확인 (오늘은 제외)
for (let i = 1; i <= 15; i++) {
const d = new Date(now);
d.setDate(now.getDate() - i);
const dStr = formatDateLocal(d);
// 주말(토:6, 일:0) 제외
if (d.getDay() === 0 || d.getDay() === 6) continue;
const hrs = dailyWork[dStr] || 0;
if (hrs < 8) {
insufficientDays.push({ date: dStr, hrs });
}
}
setUnregisteredJobReportCount(insufficientDays.length);
setUnregisteredJobReportDays(insufficientDays);
}
} catch (error) {
console.error('미등록 업무일지 로드 오류:', error);
}
}, []);
// 초기화 완료 플래그
const [initialized, setInitialized] = useState(false);
@@ -128,6 +185,7 @@ export function Jobreport() {
const handleSearchAndLoadToday = async () => {
await handleSearch();
loadTodayWork(selectedUser);
loadUnregisteredJobReports(selectedUser);
};
// 사용자 목록 로드
@@ -181,7 +239,10 @@ export function Jobreport() {
// 새 업무일지 추가 모달
const openAddModal = () => {
setEditingItem(null);
setFormData(initialFormData);
setFormData({
...initialFormData,
pdate: formatDateLocal(new Date())
});
setShowModal(true);
};
@@ -194,7 +255,7 @@ export function Jobreport() {
const data = response.Data;
setEditingItem(null); // 새로 추가하는 것이므로 null
setFormData({
pdate: new Date().toISOString().split('T')[0], // 오늘 날짜
pdate: formatDateLocal(new Date()), // 오늘 날짜 (로컬 시간 기준)
projectName: data.projectName || '',
pidx: data.pidx ?? null, // pidx도 복사
requestpart: data.requestpart || '',
@@ -207,8 +268,8 @@ export function Jobreport() {
ot: 0, // OT 초기화
otStart: data.otStart ? data.otStart.substring(11, 16) : '18:00',
otEnd: data.otEnd ? data.otEnd.substring(11, 16) : '20:00',
jobgrp: '',
tag: '',
jobgrp: data.jobgrp || '',
tag: data.tag || '',
});
setShowModal(true);
}
@@ -313,6 +374,7 @@ export function Jobreport() {
setShowModal(false);
loadData();
loadTodayWork(selectedUser);
loadUnregisteredJobReports(selectedUser);
} else {
alert(response.Message || '저장에 실패했습니다.');
}
@@ -335,6 +397,7 @@ export function Jobreport() {
alert('삭제되었습니다.');
loadData();
loadTodayWork(selectedUser);
loadUnregisteredJobReports(selectedUser);
} else {
alert(response.Message || '삭제에 실패했습니다.');
}
@@ -409,32 +472,32 @@ export function Jobreport() {
{/* 좌측: 필터 영역 */}
<div className="flex-1">
<div className="flex items-start gap-3">
{/* 빠른 날짜 선택 버튼 */}
<div className="flex flex-col gap-2">
{/* 빠른 날짜 선택 버튼 - 2x2 그리드 */}
<div className="grid grid-cols-2 gap-2">
<button
onClick={setToday}
className="h-8 bg-white/10 hover:bg-white/20 text-white text-xs px-3 rounded-lg transition-colors whitespace-nowrap"
className="h-10 bg-white/10 hover:bg-white/20 text-white text-xs px-2 rounded-lg transition-colors whitespace-nowrap"
title="오늘 날짜로 설정"
>
</button>
<button
onClick={setYesterday}
className="h-8 bg-white/10 hover:bg-white/20 text-white text-xs px-3 rounded-lg transition-colors whitespace-nowrap"
className="h-10 bg-white/10 hover:bg-white/20 text-white text-xs px-2 rounded-lg transition-colors whitespace-nowrap"
title="어제 날짜로 설정"
>
</button>
<button
onClick={setThisMonth}
className="h-8 bg-white/10 hover:bg-white/20 text-white text-xs px-3 rounded-lg transition-colors whitespace-nowrap"
className="h-10 bg-white/10 hover:bg-white/20 text-white text-xs px-2 rounded-lg transition-colors whitespace-nowrap"
title="이번 달 1일부터 말일까지"
>
</button>
<button
onClick={setLastMonth}
className="h-8 bg-white/10 hover:bg-white/20 text-white text-xs px-3 rounded-lg transition-colors whitespace-nowrap"
className="h-10 bg-white/10 hover:bg-white/20 text-white text-xs px-2 rounded-lg transition-colors whitespace-nowrap"
title="저번달 1일부터 말일까지"
>
@@ -510,7 +573,7 @@ export function Jobreport() {
className="h-10 bg-success-500 hover:bg-success-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center"
>
<Plus className="w-4 h-4 mr-2" />
</button>
</div>
</div>
@@ -520,31 +583,48 @@ export function Jobreport() {
<div className="flex-shrink-0 flex flex-col gap-3 justify-center">
<button
onClick={() => setShowDayReportModal(true)}
className="h-12 bg-indigo-500 hover:bg-indigo-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center whitespace-nowrap"
className="h-10 bg-indigo-500 hover:bg-indigo-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center whitespace-nowrap"
>
<Calendar className="w-4 h-4 mr-2" />
</button>
<button
onClick={() => setShowTypeReportModal(true)}
className="h-12 bg-purple-500 hover:bg-purple-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center whitespace-nowrap"
className="h-10 bg-purple-500 hover:bg-purple-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center whitespace-nowrap"
>
<FileText className="w-4 h-4 mr-2" />
</button>
</div>
{/* 미등록 업무일지 카드 */}
<div className="flex-shrink-0 w-40">
<div
className="bg-white/10 rounded-xl p-4 h-full flex flex-col justify-center cursor-pointer hover:bg-white/20 transition-colors"
onClick={() => setShowUnregisteredModal(true)}
>
<div className="text-white/70 text-sm font-medium mb-2 text-center flex items-center justify-center gap-2">
<AlertTriangle className="w-4 h-4 text-danger-400" />
</div>
<div className="text-center">
<span className="text-3xl font-bold text-danger-400">{unregisteredJobReportCount}</span>
<span className="text-white/70 text-lg ml-1"></span>
</div>
</div>
</div>
{/* 우측: 오늘 근무시간 */}
<div className="flex-shrink-0 w-48">
<div className="flex-shrink-0 w-40">
<div className="bg-white/10 rounded-xl p-4 h-full flex flex-col justify-center">
<div className="text-white/70 text-sm font-medium mb-2 text-center"> </div>
<div className="text-center">
<span className="text-3xl font-bold text-white">{todayWork.hrs}</span>
<span className="text-3xl font-bold text-white">{todayWork.hrs.toFixed(1)}</span>
<span className="text-white/70 text-lg ml-1"></span>
</div>
{todayWork.ot > 0 && (
<div className="text-center mt-1">
<span className="text-warning-400 text-sm">OT: {todayWork.ot}</span>
<span className="text-warning-400 text-sm">OT: {todayWork.ot.toFixed(1)}</span>
</div>
)}
</div>
@@ -567,13 +647,13 @@ export function Jobreport() {
<thead className="bg-white/10">
<tr>
<th className="px-2 py-3 text-center text-xs font-medium text-white/70 uppercase w-10"></th>
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
{canViewOT && <th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase">OT</th>}
<th className="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase w-24"></th>
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase" style={{ width: '35%' }}></th>
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
{canViewOT && <th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase">OT</th>}
<th className="px-2 py-3 text-left text-xs font-medium text-white/70 uppercase"></th>
</tr>
</thead>
<tbody className="divide-y divide-white/10">
@@ -596,38 +676,51 @@ export function Jobreport() {
paginatedList.map((item) => (
<tr
key={item.idx}
className={`hover:bg-white/5 transition-colors cursor-pointer ${item.type === '휴가' ? 'bg-gradient-to-r from-lime-400/30 via-emerald-400/20 to-teal-400/30' : ''}`}
onClick={() => openEditModal(item)}
className="hover:bg-white/5 transition-colors"
>
<td className="px-2 py-3 text-center">
<button
onClick={(e) => openCopyModal(item, e)}
className="text-white/40 hover:text-primary-400 transition-colors"
title="복사하여 새로 작성"
>
<Copy className="w-4 h-4" />
</button>
<td
className="px-2 py-3 text-center cursor-pointer hover:bg-primary-500/10 transition-colors"
onClick={(e) => openCopyModal(item, e)}
title="복사하여 새로 작성"
>
<Copy className="w-4 h-4 mx-auto text-white/40" />
</td>
<td className="px-4 py-3 text-white text-sm">{formatDate(item.pdate)}</td>
<td className={`px-4 py-3 text-sm font-medium max-w-xs truncate ${item.pidx && item.pidx > 0 ? 'text-white' : 'text-white/50'}`} title={item.projectName}>
{item.projectName || '-'}
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>{formatDate(item.pdate)}</td>
<td className={`px-4 py-3 text-sm font-medium ${item.pidx && item.pidx > 0 ? 'text-white' : 'text-white/50'}`}>
<div className="flex items-center space-x-2">
{item.pidx && item.pidx > 0 && (
<button
onClick={(e) => {
e.stopPropagation();
window.open(`#/project-detail/${item.pidx}`, '_blank');
}}
className="text-primary-400 hover:text-primary-300 transition-colors flex-shrink-0"
title="프로젝트 정보 보기"
>
<Info className="w-4 h-4" />
</button>
)}
<span className="truncate cursor-pointer" onClick={() => openEditModal(item)} title={item.projectName}>
{item.projectName || '-'}
</span>
</div>
</td>
<td className="px-4 py-3 text-white text-sm">{item.type || '-'}</td>
<td className="px-4 py-3 text-sm">
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>{item.type || '-'}</td>
<td className="px-4 py-3 text-sm cursor-pointer" onClick={() => openEditModal(item)}>
<span className={`px-2 py-1 rounded text-xs ${item.status?.includes('완료') ? 'bg-green-500/20 text-green-400' : 'bg-white/20 text-white/70'
}`}>
{item.status || '-'}
</span>
</td>
<td className="px-4 py-3 text-white text-sm">
{item.hrs || 0}h
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>
{item.hrs || 0}
</td>
{canViewOT && (
<td className="px-4 py-3 text-white text-sm">
{item.ot ? <span className="text-warning-400">{item.ot}h</span> : '-'}
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>
{item.ot ? <span className="text-warning-400">{item.ot}</span> : '-'}
</td>
)}
<td className="px-4 py-3 text-white text-sm">{item.name || item.id || '-'}</td>
<td className="px-4 py-3 text-white text-sm cursor-pointer" onClick={() => openEditModal(item)}>{item.name || item.id || '-'}</td>
</tr>
))
)}
@@ -708,6 +801,66 @@ export function Jobreport() {
endDate={endDate}
userId={selectedUser}
/>
{/* 업무일지 미등록 상세 모달 */}
{showUnregisteredModal && (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm p-4">
<div className="bg-slate-900 border border-white/10 rounded-2xl w-full max-w-md shadow-2xl overflow-hidden animate-scale-in">
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10 bg-white/5">
<h3 className="text-lg font-semibold text-white flex items-center gap-2">
<AlertTriangle className="w-5 h-5 text-danger-400" />
</h3>
<button
onClick={() => setShowUnregisteredModal(false)}
className="text-white/50 hover:text-white transition-colors"
>
<X className="w-5 h-5" />
</button>
</div>
<div className="p-6 max-h-[60vh] overflow-y-auto">
<p className="text-white/70 text-sm mb-4">
15( ) 8 .
</p>
{unregisteredJobReportDays.length === 0 ? (
<div className="text-center py-8 text-white/50">
.
</div>
) : (
<div className="space-y-2">
{unregisteredJobReportDays.map((day, index) => (
<div key={index} className="flex items-center justify-between p-3 bg-white/5 rounded-lg border border-white/5">
<div className="flex items-center gap-3">
<div className="w-8 h-8 rounded-full bg-danger-500/20 flex items-center justify-center text-danger-400 text-xs font-bold">
{index + 1}
</div>
<span className="text-white font-medium">{day.date}</span>
</div>
<div className="flex items-center gap-2">
<span className={`font-bold ${day.hrs === 0 ? 'text-danger-400' : 'text-warning-400'}`}>
{day.hrs}
</span>
<span className="text-white/40 text-xs">/ 8</span>
</div>
</div>
))}
</div>
)}
</div>
<div className="px-6 py-4 border-t border-white/10 bg-white/5 flex justify-end">
<button
onClick={() => setShowUnregisteredModal(false)}
className="px-4 py-2 bg-white/10 hover:bg-white/20 text-white rounded-lg transition-colors text-sm font-medium"
>
</button>
</div>
</div>
</div>
)}
</div>
);
}

View File

@@ -1,7 +1,8 @@
import { useState, useEffect } from 'react';
import { Mail, Search, RefreshCw, Calendar } from 'lucide-react';
import { Mail, Search, RefreshCw, Calendar, ChevronLeft, ChevronRight } from 'lucide-react';
import { comms } from '@/communication';
import { MailItem, UserInfo } from '@/types';
import { MailTestDialog } from '@/components/mail/MailTestDialog';
export function MailList() {
const [mailList, setMailList] = useState<MailItem[]>([]);
@@ -11,7 +12,10 @@ export function MailList() {
const [searchKey, setSearchKey] = useState('');
const [selectedItem, setSelectedItem] = useState<MailItem | null>(null);
const [showModal, setShowModal] = useState(false);
const [showTestDialog, setShowTestDialog] = useState(false);
const [currentUser, setCurrentUser] = useState<UserInfo | null>(null);
const [currentPage, setCurrentPage] = useState(1);
const pageSize = 25;
const formatDateLocal = (date: Date) => {
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
@@ -78,9 +82,17 @@ export function MailList() {
alert('시작일은 종료일보다 늦을 수 없습니다.');
return;
}
setCurrentPage(1);
loadData();
};
// 페이징 계산
const totalPages = Math.ceil(mailList.length / pageSize);
const paginatedList = mailList.slice(
(currentPage - 1) * pageSize,
currentPage * pageSize
);
const handleRowClick = (item: MailItem) => {
// 레벨 9 이상(개발자)만 상세보기 가능
if (!currentUser || currentUser.Level < 9) {
@@ -151,6 +163,16 @@ export function MailList() {
)}
</button>
{currentUser && currentUser.Level >= 9 && (
<button
onClick={() => setShowTestDialog(true)}
className="h-10 bg-green-500 hover:bg-green-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center"
>
<Mail className="w-4 h-4 mr-2" />
</button>
)}
</div>
</div>
@@ -164,7 +186,7 @@ export function MailList() {
<span className="text-white/60 text-sm">{mailList.length}</span>
</div>
<div className="divide-y divide-white/10 max-h-[calc(100vh-300px)] overflow-y-auto">
<div className="divide-y divide-white/10 max-h-[calc(100vh-380px)] overflow-y-auto">
{loading ? (
<div className="px-6 py-8 text-center">
<div className="flex items-center justify-center">
@@ -178,7 +200,7 @@ export function MailList() {
<p className="text-white/50"> .</p>
</div>
) : (
mailList.map((item) => (
paginatedList.map((item) => (
<div
key={item.idx}
className={`px-6 py-4 transition-colors ${currentUser && currentUser.Level >= 9 ? 'hover:bg-white/5 cursor-pointer' : 'cursor-default'}`}
@@ -215,6 +237,29 @@ export function MailList() {
))
)}
</div>
{/* 페이징 */}
{totalPages > 1 && (
<div className="flex items-center justify-center gap-2 px-6 py-3 border-t border-white/10">
<button
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
disabled={currentPage === 1}
className="p-1 rounded hover:bg-white/10 disabled:opacity-30 text-white/70"
>
<ChevronLeft className="w-5 h-5" />
</button>
<span className="text-white/70 text-sm">
{currentPage} / {totalPages}
</span>
<button
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
disabled={currentPage === totalPages}
className="p-1 rounded hover:bg-white/10 disabled:opacity-30 text-white/70"
>
<ChevronRight className="w-5 h-5" />
</button>
</div>
)}
</div>
{/* 상세 모달 */}
@@ -283,6 +328,15 @@ export function MailList() {
</div>
</div>
)}
{/* 메일 테스트 다이얼로그 */}
<MailTestDialog
isOpen={showTestDialog}
onClose={() => {
setShowTestDialog(false);
loadData(); // 목록 새로고침
}}
/>
</div>
);
}

View File

@@ -0,0 +1,588 @@
import { useState, useEffect } from 'react';
import {
ClipboardList,
Search,
RefreshCw,
Plus,
Save,
Trash2,
X,
DollarSign,
} from 'lucide-react';
import { comms } from '@/communication';
import { PartListItem } from '@/types';
import { useSearchParams } from 'react-router-dom';
export function PartList() {
const [searchParams] = useSearchParams();
const projectIdx = parseInt(searchParams.get('idx') || '0');
const projectName = searchParams.get('name') || '';
const [parts, setParts] = useState<PartListItem[]>([]);
const [filteredParts, setFilteredParts] = useState<PartListItem[]>([]);
const [loading, setLoading] = useState(false);
const [searchKey, setSearchKey] = useState('');
const [editingIdx, setEditingIdx] = useState<number | null>(null);
const [editForm, setEditForm] = useState<Partial<PartListItem>>({});
const [showSummary, setShowSummary] = useState(false);
// 데이터 로드
const loadParts = async () => {
setLoading(true);
try {
console.log('[PartList] 로드 시작, projectIdx:', projectIdx);
const result = await comms.getPartList(projectIdx);
console.log('[PartList] 결과:', result);
if (result.Success && result.Data) {
console.log('[PartList] 데이터 개수:', result.Data.length);
setParts(result.Data);
setFilteredParts(result.Data);
} else {
console.error('[PartList] 실패:', result.Message);
alert(result.Message || '파트리스트 로드 실패');
}
} catch (error) {
console.error('파트리스트 로드 실패:', error);
alert('파트리스트 로드 중 오류: ' + error);
} finally {
setLoading(false);
}
};
useEffect(() => {
if (projectIdx > 0) {
loadParts();
}
}, [projectIdx]);
// 검색
useEffect(() => {
if (!searchKey.trim()) {
setFilteredParts(parts);
return;
}
const search = searchKey.toLowerCase();
const filtered = parts.filter((part) => {
return (
part.itemsid?.toLowerCase().includes(search) ||
part.itemname?.toLowerCase().includes(search) ||
part.itemmodel?.toLowerCase().includes(search)
);
});
setFilteredParts(filtered);
}, [searchKey, parts]);
// 편집 시작
const startEdit = (part: PartListItem) => {
setEditingIdx(part.idx);
setEditForm({ ...part });
};
// 편집 취소
const cancelEdit = () => {
setEditingIdx(null);
setEditForm({});
};
// 저장
const handleSave = async () => {
if (!editForm.itemname || !editForm.item) {
alert('품명과 자재번호는 필수입니다.');
return;
}
try {
const result = await comms.savePartList(
editingIdx || 0,
projectIdx,
editForm.itemgroup || '',
editForm.itemname || '',
editForm.item || '',
editForm.itemmodel || '',
'', // itemscale 제거됨
editForm.itemunit || '',
editForm.qty || 0,
editForm.price || 0,
editForm.itemsupply || '',
editForm.itemsupplyidx || 0,
editForm.itemmanu || '',
editForm.itemsid || '',
editForm.option1 || '',
editForm.remark || '',
editForm.no || 0,
editForm.qtybuy || 0
);
if (result.Success) {
await loadParts();
cancelEdit();
} else {
alert(result.Message || '저장 실패');
}
} catch (error) {
console.error('저장 실패:', error);
alert('저장 중 오류가 발생했습니다.');
}
};
// 삭제
const handleDelete = async (idx: number) => {
if (!confirm('정말 삭제하시겠습니까?')) return;
try {
const result = await comms.deletePartList(idx);
if (result.Success) {
await loadParts();
} else {
alert(result.Message || '삭제 실패');
}
} catch (error) {
console.error('삭제 실패:', error);
alert('삭제 중 오류가 발생했습니다.');
}
};
// 새 항목 추가
const addNew = () => {
setEditingIdx(-1);
setEditForm({
Project: projectIdx,
itemgroup: '',
itemname: '',
item: '',
itemmodel: '',
itemunit: 'EA',
qty: 1,
price: 0,
itemsupply: '',
itemsupplyidx: 0,
itemmanu: '',
itemsid: '',
option1: '',
remark: '',
no: 0,
qtybuy: 0,
});
};
// 금액 계산
const getAmount = (qty: number, price: number) => qty * price;
// 합계 계산
const totalAmount = filteredParts.reduce((sum, part) => sum + getAmount(part.qty || 0, part.price || 0), 0);
// 그룹별 합계
const groupSummary = filteredParts.reduce((acc, part) => {
const group = part.itemgroup || '미분류';
if (!acc[group]) {
acc[group] = { count: 0, amount: 0 };
}
acc[group].count++;
acc[group].amount += getAmount(part.qty || 0, part.price || 0);
return acc;
}, {} as Record<string, { count: number; amount: number }>);
return (
<div className="p-4 space-y-4">
{/* 헤더 */}
<div className="glass-effect rounded-xl p-4">
<div className="flex items-center justify-between mb-4">
<div className="flex items-center gap-3">
<ClipboardList className="w-6 h-6 text-amber-400" />
<div>
<h1 className="text-xl font-bold text-white"></h1>
<p className="text-sm text-white/60">{projectName}</p>
</div>
<span className="text-white/50 text-sm">({filteredParts.length})</span>
</div>
<div className="flex items-center gap-2">
<button
onClick={addNew}
className="flex items-center gap-2 px-3 py-1.5 bg-primary-600 hover:bg-primary-500 text-white rounded transition-colors"
>
<Plus className="w-4 h-4" />
<span className="text-sm"></span>
</button>
<button
onClick={loadParts}
disabled={loading}
className="p-2 hover:bg-white/10 rounded transition-colors disabled:opacity-50"
title="새로고침"
>
<RefreshCw className={`w-5 h-5 text-white/70 ${loading ? 'animate-spin' : ''}`} />
</button>
</div>
</div>
{/* 검색 */}
<div className="flex items-center gap-2 bg-white/5 rounded-lg px-3 py-2">
<Search className="w-4 h-4 text-white/50" />
<input
type="text"
value={searchKey}
onChange={(e) => setSearchKey(e.target.value)}
placeholder="SID, 품명, 모델로 검색..."
className="flex-1 bg-transparent text-white placeholder-white/30 focus:outline-none text-sm"
/>
{searchKey && (
<button onClick={() => setSearchKey('')} className="text-white/50 hover:text-white/70">
<X className="w-4 h-4" />
</button>
)}
</div>
</div>
{/* 테이블 */}
<div className="glass-effect rounded-xl overflow-hidden">
<div className="overflow-x-auto">
{loading && parts.length === 0 ? (
<div className="flex items-center justify-center h-64">
<RefreshCw className="w-8 h-8 text-primary-500 animate-spin" />
</div>
) : (
<table className="w-full">
<thead className="bg-slate-700/50 sticky top-0 z-10">
<tr className="border-b border-white/10">
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-12">No</th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-24"></th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-24">SID</th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium"></th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32"></th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-16"></th>
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-20"></th>
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-28"></th>
<th className="px-2 py-2 text-right text-xs text-white/70 font-medium w-32"></th>
<th className="px-2 py-2 text-left text-xs text-white/70 font-medium w-32"></th>
<th className="px-2 py-2 text-center text-xs text-white/70 font-medium w-20"></th>
</tr>
</thead>
<tbody>
{filteredParts.length === 0 && !loading ? (
<tr>
<td colSpan={11} className="px-2 py-8 text-center text-white/40 text-sm">
{searchKey ? '검색 결과가 없습니다.' : '등록된 파트가 없습니다.'}
</td>
</tr>
) : (
filteredParts.map((part) => {
const isEditing = editingIdx === part.idx;
return (
<tr
key={part.idx}
className={`border-b border-white/5 hover:bg-white/5 transition-colors ${
isEditing ? 'bg-primary-500/10' : ''
}`}
>
<td className="px-2 py-2">
{isEditing ? (
<input
type="number"
value={editForm.no || 0}
onChange={(e) => setEditForm({ ...editForm, no: parseInt(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.no || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemgroup || ''}
onChange={(e) => setEditForm({ ...editForm, itemgroup: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemgroup || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemsid || ''}
onChange={(e) => setEditForm({ ...editForm, itemsid: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemsid || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemname || ''}
onChange={(e) => setEditForm({ ...editForm, itemname: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
required
/>
) : (
<span className="text-white/90 text-xs font-medium">{part.itemname || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemmodel || ''}
onChange={(e) => setEditForm({ ...editForm, itemmodel: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemmodel || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemunit || ''}
onChange={(e) => setEditForm({ ...editForm, itemunit: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemunit || ''}</span>
)}
</td>
<td className="px-2 py-2 text-right">
{isEditing ? (
<input
type="number"
value={editForm.qty || 0}
onChange={(e) => setEditForm({ ...editForm, qty: parseFloat(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
/>
) : (
<span className="text-white/70 text-xs">{part.qty?.toLocaleString() || 0}</span>
)}
</td>
<td className="px-2 py-2 text-right">
{isEditing ? (
<input
type="number"
value={editForm.price || 0}
onChange={(e) => setEditForm({ ...editForm, price: parseFloat(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
/>
) : (
<span className="text-white/70 text-xs">{part.price?.toLocaleString() || 0}</span>
)}
</td>
<td className="px-2 py-2 text-right">
<span className="text-white/90 text-xs font-medium">
{getAmount(
isEditing ? editForm.qty || 0 : part.qty || 0,
isEditing ? editForm.price || 0 : part.price || 0
).toLocaleString()}
</span>
</td>
<td className="px-2 py-2">
{isEditing ? (
<input
type="text"
value={editForm.itemsupply || ''}
onChange={(e) => setEditForm({ ...editForm, itemsupply: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
) : (
<span className="text-white/70 text-xs">{part.itemsupply || ''}</span>
)}
</td>
<td className="px-2 py-2">
{isEditing ? (
<div className="flex items-center justify-center gap-1">
<button
onClick={handleSave}
className="p-1 hover:bg-green-500/20 text-green-400 rounded transition-colors"
title="저장"
>
<Save className="w-4 h-4" />
</button>
<button
onClick={cancelEdit}
className="p-1 hover:bg-white/10 text-white/50 rounded transition-colors"
title="취소"
>
<X className="w-4 h-4" />
</button>
</div>
) : (
<div className="flex items-center justify-center gap-1">
<button
onClick={() => startEdit(part)}
className="p-1 hover:bg-white/10 text-white/70 rounded transition-colors text-xs"
>
</button>
<button
onClick={() => handleDelete(part.idx)}
className="p-1 hover:bg-red-500/20 text-red-400 rounded transition-colors"
title="삭제"
>
<Trash2 className="w-4 h-4" />
</button>
</div>
)}
</td>
</tr>
);
})
)}
{/* 새 항목 추가 행 */}
{editingIdx === -1 && (
<tr className="border-b border-white/5 bg-primary-500/10">
<td className="px-2 py-2">
<input
type="number"
value={editForm.no || 0}
onChange={(e) => setEditForm({ ...editForm, no: parseInt(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemgroup || ''}
onChange={(e) => setEditForm({ ...editForm, itemgroup: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="그룹"
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemsid || ''}
onChange={(e) => setEditForm({ ...editForm, itemsid: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="SID"
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemname || ''}
onChange={(e) => setEditForm({ ...editForm, itemname: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="품명 *"
required
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemmodel || ''}
onChange={(e) => setEditForm({ ...editForm, itemmodel: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="모델"
/>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemunit || ''}
onChange={(e) => setEditForm({ ...editForm, itemunit: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="단위"
/>
</td>
<td className="px-2 py-2 text-right">
<input
type="number"
value={editForm.qty || 0}
onChange={(e) => setEditForm({ ...editForm, qty: parseFloat(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
/>
</td>
<td className="px-2 py-2 text-right">
<input
type="number"
value={editForm.price || 0}
onChange={(e) => setEditForm({ ...editForm, price: parseFloat(e.target.value) || 0 })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none text-right"
/>
</td>
<td className="px-2 py-2 text-right">
<span className="text-white/90 text-xs font-medium">
{getAmount(editForm.qty || 0, editForm.price || 0).toLocaleString()}
</span>
</td>
<td className="px-2 py-2">
<input
type="text"
value={editForm.itemsupply || ''}
onChange={(e) => setEditForm({ ...editForm, itemsupply: e.target.value })}
className="w-full bg-slate-700/50 text-white text-xs px-2 py-1 rounded border border-white/10 focus:border-primary-500 focus:outline-none"
placeholder="공급처"
/>
</td>
<td className="px-2 py-2">
<div className="flex items-center justify-center gap-1">
<button
onClick={handleSave}
className="p-1 hover:bg-green-500/20 text-green-400 rounded transition-colors"
title="저장"
>
<Save className="w-4 h-4" />
</button>
<button
onClick={cancelEdit}
className="p-1 hover:bg-white/10 text-white/50 rounded transition-colors"
title="취소"
>
<X className="w-4 h-4" />
</button>
</div>
</td>
</tr>
)}
</tbody>
</table>
)}
</div>
</div>
{/* 하단 정보 */}
<div className="flex gap-4">
{/* 좌측: 비용 요약 */}
<div className="glass-effect rounded-xl p-4 flex-1">
<button
onClick={() => setShowSummary(!showSummary)}
className="flex items-center gap-2 text-amber-400 hover:text-amber-300 mb-3"
>
<DollarSign className="w-5 h-5" />
<span className="font-medium"> </span>
</button>
{showSummary && (
<div className="space-y-2">
{Object.entries(groupSummary).map(([group, data]) => (
<div key={group} className="flex items-center justify-between text-sm border-b border-white/5 pb-2">
<span className="text-white/70">{group}</span>
<div className="flex items-center gap-4">
<span className="text-white/50 text-xs">{data.count}</span>
<span className="text-primary-400 font-medium">{data.amount.toLocaleString()}</span>
</div>
</div>
))}
</div>
)}
</div>
{/* 우측: 합계 */}
<div className="glass-effect rounded-xl p-4 min-w-[300px]">
<div className="flex justify-between items-center mb-2">
<span className="text-white/70 text-sm"> </span>
<span className="text-white font-medium">{filteredParts.length}</span>
</div>
<div className="flex justify-between items-center">
<span className="text-white/70 text-sm"> </span>
<span className="text-amber-400 font-bold text-lg">{totalAmount.toLocaleString()}</span>
</div>
</div>
</div>
</div>
);
}

View File

@@ -1,452 +1,17 @@
import { useState, useEffect } from 'react';
import { FileText, Search, RefreshCw, Calendar, Edit3, User, Plus } from 'lucide-react';
import { comms } from '@/communication';
import { BoardItem } from '@/types';
import { BoardList } from './BoardList';
import { FileText } from 'lucide-react';
export function PatchList() {
const [boardList, setBoardList] = useState<BoardItem[]>([]);
const [loading, setLoading] = useState(false);
const [searchKey, setSearchKey] = useState('');
const [selectedItem, setSelectedItem] = useState<BoardItem | null>(null);
const [showModal, setShowModal] = useState(false);
const [showEditModal, setShowEditModal] = useState(false);
const [editFormData, setEditFormData] = useState<BoardItem | null>(null);
const [userLevel, setUserLevel] = useState(0);
const [userId, setUserId] = useState('');
useEffect(() => {
loadUserInfo();
loadData();
}, []);
const loadUserInfo = async () => {
try {
const response = await comms.checkLoginStatus();
if (response.Success && response.User) {
setUserLevel(response.User.Level);
setUserId(response.User.Id);
}
} catch (error) {
console.error('사용자 정보 로드 오류:', error);
}
};
const loadData = async () => {
setLoading(true);
try {
console.log('패치내역 조회:', { bidx: 5, searchKey });
const response = await comms.getBoardList(5, searchKey); // bidx=5: 패치내역
console.log('패치내역 응답:', response);
if (response.Success && response.Data) {
setBoardList(response.Data);
} else {
console.warn('패치내역 없음:', response.Message);
setBoardList([]);
}
} catch (error) {
console.error('패치내역 로드 오류:', error);
alert('데이터를 불러오는 중 오류가 발생했습니다.');
} finally {
setLoading(false);
}
};
const handleSearch = () => {
loadData();
};
const handleRowClick = async (item: BoardItem) => {
try {
const response = await comms.getBoardDetail(item.idx);
if (response.Success && response.Data) {
setSelectedItem(response.Data);
// 개발자(레벨 >= 9) 또는 사번 395552이면 바로 편집 모드
if (userLevel >= 9 || userId === '395552') {
setEditFormData(response.Data);
setShowEditModal(true);
} else {
setShowModal(true);
}
}
} catch (error) {
console.error('상세 조회 오류:', error);
alert('데이터를 불러오는 중 오류가 발생했습니다.');
}
};
const handleEditClick = () => {
if (selectedItem) {
setEditFormData(selectedItem);
setShowModal(false);
setShowEditModal(true);
}
};
const handleEditSave = async () => {
if (!editFormData) return;
try {
const isNew = editFormData.idx === 0;
if (isNew) {
// 신규 등록
const response = await comms.addBoard(
5, // bidx: 패치내역
editFormData.header || '',
editFormData.cate || '',
editFormData.title || '',
editFormData.contents || ''
);
if (response.Success) {
alert('등록되었습니다.');
setShowEditModal(false);
setEditFormData(null);
loadData();
} else {
alert(response.Message || '등록에 실패했습니다.');
}
} else {
// 수정
const response = await comms.editBoard(
editFormData.idx,
editFormData.header || '',
editFormData.cate || '',
editFormData.title || '',
editFormData.contents || ''
);
if (response.Success) {
alert('수정되었습니다.');
setShowEditModal(false);
setEditFormData(null);
loadData();
} else {
alert(response.Message || '수정에 실패했습니다.');
}
}
} catch (error) {
console.error('저장 오류:', error);
alert('저장 중 오류가 발생했습니다.');
}
};
const handleDelete = async () => {
if (!editFormData || editFormData.idx === 0) return;
if (!confirm('정말 삭제하시겠습니까?')) return;
try {
const response = await comms.deleteBoard(editFormData.idx);
if (response.Success) {
alert('삭제되었습니다.');
setShowEditModal(false);
setEditFormData(null);
loadData();
} else {
alert(response.Message || '삭제에 실패했습니다.');
}
} catch (error) {
console.error('삭제 오류:', error);
alert('삭제 중 오류가 발생했습니다.');
}
};
const formatDate = (dateStr: string | null) => {
if (!dateStr) return '-';
try {
const date = new Date(dateStr);
const yy = String(date.getFullYear()).slice(-2);
const mm = String(date.getMonth() + 1).padStart(2, '0');
const dd = String(date.getDate()).padStart(2, '0');
return `${yy}.${mm}.${dd}`;
} catch {
return dateStr;
}
};
return (
<div className="space-y-6 animate-fade-in">
{/* 검색 필터 */}
<div className="glass-effect rounded-2xl p-6">
<div className="flex items-center gap-4">
<div className="flex items-center gap-2 flex-1">
<label className="text-white/70 text-sm font-medium whitespace-nowrap"></label>
<input
type="text"
value={searchKey}
onChange={(e) => setSearchKey(e.target.value)}
onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
placeholder="제목, 내용, 작성자 등"
className="flex-1 h-10 bg-white/20 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
/>
</div>
<button
onClick={handleSearch}
disabled={loading}
className="h-10 bg-primary-500 hover:bg-primary-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center disabled:opacity-50"
>
{loading ? (
<RefreshCw className="w-4 h-4 mr-2 animate-spin" />
) : (
<Search className="w-4 h-4 mr-2" />
)}
</button>
<button
onClick={() => {
setEditFormData({
idx: 0,
bidx: 5,
gcode: '',
header: '',
cate: '패치',
title: '',
contents: '',
file: '',
guid: '',
url: '',
wuid: '',
wuid_name: '',
wdate: null,
project: '',
pidx: 0,
close: false,
remark: ''
});
setShowEditModal(true);
}}
disabled={!(userLevel >= 9 || userId === '395552')}
className="h-10 bg-green-500 hover:bg-green-600 text-white px-6 rounded-lg transition-colors flex items-center justify-center disabled:opacity-30 disabled:cursor-not-allowed"
>
<Plus className="w-4 h-4 mr-2" />
</button>
</div>
</div>
{/* 패치내역 목록 */}
<div className="glass-effect rounded-2xl overflow-hidden">
<div className="px-6 py-4 border-b border-white/10 flex items-center justify-between">
<h3 className="text-lg font-semibold text-white flex items-center">
<FileText className="w-5 h-5 mr-2" />
</h3>
<span className="text-white/60 text-sm">{boardList.length}</span>
</div>
<div className="divide-y divide-white/10 max-h-[calc(100vh-300px)] overflow-y-auto">
{loading ? (
<div className="px-6 py-8 text-center">
<div className="flex items-center justify-center">
<RefreshCw className="w-5 h-5 mr-2 animate-spin text-white/50" />
<span className="text-white/50"> ...</span>
</div>
</div>
) : boardList.length === 0 ? (
<div className="px-6 py-8 text-center">
<FileText className="w-12 h-12 mx-auto mb-3 text-white/30" />
<p className="text-white/50"> .</p>
</div>
) : (
boardList.map((item) => (
<div
key={item.idx}
className="px-6 py-3 hover:bg-white/5 transition-colors cursor-pointer"
onClick={() => handleRowClick(item)}
>
<div className="flex items-center gap-3">
<div className="flex items-center gap-2 flex-shrink-0">
{item.cate && (
<span className={`px-2 py-0.5 text-xs rounded whitespace-nowrap ${
item.cate.toLowerCase() === 'update'
? 'bg-lime-500/20 text-lime-400'
: 'bg-red-500/20 text-red-400'
}`}>
{item.cate}
</span>
)}
{item.header && (
<span className="px-2 py-0.5 bg-primary-500/20 text-primary-400 text-xs rounded whitespace-nowrap">
{item.header}
</span>
)}
</div>
<h4 className="text-white font-medium flex-1 min-w-0 truncate">{item.title}</h4>
<div className="flex items-center text-white/60 text-xs flex-shrink-0">
<Calendar className="w-3 h-3 mr-1" />
{formatDate(item.wdate)}
</div>
</div>
</div>
))
)}
</div>
</div>
{/* 상세 모달 */}
{showModal && selectedItem && (
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
<div className="flex items-center gap-2">
{selectedItem.header && (
<span className="px-2 py-1 bg-primary-500/20 text-primary-400 text-sm rounded">
{selectedItem.header}
</span>
)}
{selectedItem.cate && (
<span className="px-2 py-1 bg-white/10 text-white/70 text-sm rounded">
{selectedItem.cate}
</span>
)}
<h2 className="text-xl font-bold text-white ml-2">{selectedItem.title}</h2>
</div>
<button
onClick={() => setShowModal(false)}
className="text-white/50 hover:text-white transition-colors"
>
<span className="text-2xl">×</span>
</button>
</div>
<div className="px-6 py-4 border-b border-white/10 flex items-center gap-4 text-sm text-white/60">
<div className="flex items-center">
<User className="w-4 h-4 mr-1" />
{selectedItem.wuid_name || selectedItem.wuid}
</div>
<div className="flex items-center">
<Calendar className="w-4 h-4 mr-1" />
{formatDate(selectedItem.wdate)}
</div>
</div>
<div className="overflow-y-auto max-h-[calc(90vh-180px)] p-6">
<div className="prose prose-invert max-w-none">
<div className="text-white whitespace-pre-wrap">{selectedItem.contents}</div>
</div>
</div>
<div className="flex items-center justify-end gap-2 px-6 py-4 border-t border-white/10 bg-white/5">
{(userLevel >= 9 || userId === '395552') && (
<button
onClick={handleEditClick}
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors flex items-center"
>
<Edit3 className="w-4 h-4 mr-2" />
</button>
)}
<button
onClick={() => setShowModal(false)}
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
>
</button>
</div>
</div>
</div>
)}
{/* 편집 모달 */}
{showEditModal && editFormData && (
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
<div className="bg-gray-900 rounded-2xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden border border-white/10">
<div className="flex items-center justify-between px-6 py-4 border-b border-white/10">
<h2 className="text-xl font-bold text-white flex items-center">
<Edit3 className="w-5 h-5 mr-2" />
</h2>
<button
onClick={() => setShowEditModal(false)}
className="text-white/50 hover:text-white transition-colors"
>
<span className="text-2xl">×</span>
</button>
</div>
<div className="overflow-y-auto max-h-[calc(90vh-180px)] p-6 space-y-4">
<div className="grid grid-cols-2 gap-4">
<div>
<label className="block text-white/70 text-sm font-medium mb-2"></label>
<select
value={editFormData.cate || '패치'}
onChange={(e) => setEditFormData({ ...editFormData, cate: e.target.value })}
className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white focus:outline-none focus:ring-2 focus:ring-primary-400"
>
<option value="패치" className="bg-gray-800"></option>
<option value="update" className="bg-gray-800">update</option>
</select>
</div>
<div>
<label className="block text-white/70 text-sm font-medium mb-2"></label>
<input
type="text"
value={editFormData.header || ''}
onChange={(e) => setEditFormData({ ...editFormData, header: e.target.value })}
className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
placeholder="예: v2.0.0"
/>
</div>
</div>
<div>
<label className="block text-white/70 text-sm font-medium mb-2"></label>
<input
type="text"
value={editFormData.title || ''}
onChange={(e) => setEditFormData({ ...editFormData, title: e.target.value })}
className="w-full h-10 bg-white/10 border border-white/30 rounded-lg px-3 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400"
placeholder="패치 제목"
/>
</div>
<div>
<label className="block text-white/70 text-sm font-medium mb-2"></label>
<textarea
value={editFormData.contents || ''}
onChange={(e) => setEditFormData({ ...editFormData, contents: e.target.value })}
rows={15}
className="w-full bg-white/10 border border-white/30 rounded-lg px-3 py-2 text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400 resize-none"
placeholder="패치 내용을 입력하세요..."
/>
</div>
</div>
<div className="flex items-center justify-between px-6 py-4 border-t border-white/10 bg-white/5">
<div>
{editFormData && editFormData.idx > 0 && (
<button
onClick={handleDelete}
className="px-4 py-2 rounded-lg bg-red-500 hover:bg-red-600 text-white transition-colors"
>
</button>
)}
</div>
<div className="flex items-center gap-2">
<button
onClick={() => setShowEditModal(false)}
className="px-4 py-2 rounded-lg bg-white/10 hover:bg-white/20 text-white transition-colors"
>
</button>
<button
onClick={handleEditSave}
className="px-4 py-2 rounded-lg bg-primary-500 hover:bg-primary-600 text-white transition-colors"
>
</button>
</div>
</div>
</div>
</div>
)}
</div>
<BoardList
bidx={5}
title="패치 내역"
icon={<FileText className="w-5 h-5" />}
defaultCategory="PATCH"
categories={[
{ value: 'PATCH', label: 'PATCH', color: 'red' },
{ value: 'UPDATE', label: 'UPDATE', color: 'lime' }
]}
/>
);
}

View File

@@ -8,10 +8,14 @@ import {
User,
Calendar,
ExternalLink,
ClipboardList,
Mail,
Edit2,
} from 'lucide-react';
import { comms } from '@/communication';
import { ProjectListItem, ProjectListResponse } from '@/types';
import { ProjectDetailDialog } from '@/components/project';
import clsx from 'clsx';
// 상태별 색상 매핑
const statusColors: Record<string, { text: string; bg: string }> = {
@@ -29,6 +33,11 @@ export function Project() {
const [loading, setLoading] = useState(false);
const [selectedProject, setSelectedProject] = useState<ProjectListItem | null>(null);
const [showDetailDialog, setShowDetailDialog] = useState(false);
const [expandedProject, setExpandedProject] = useState<number | null>(null);
const [projectHistory, setProjectHistory] = useState<any[]>([]);
const [loadingHistory, setLoadingHistory] = useState(false);
const [editingHistory, setEditingHistory] = useState<any | null>(null);
const [editRemark, setEditRemark] = useState('');
// 필터 상태
const [categories, setCategories] = useState<string[]>([]);
@@ -37,14 +46,16 @@ export function Project() {
const [selectedProcess, setSelectedProcess] = useState('전체');
const [userFilter, setUserFilter] = useState('');
const [currentUserName, setCurrentUserName] = useState('');
const [userLevel, setUserLevel] = useState<number>(0);
const [userCode, setUserCode] = useState<string>('');
// 상태 필터 체크박스
const [statusChecks, setStatusChecks] = useState({
검토: true,
진행: true,
대기: true,
대기: false,
보류: true,
완료: false,
완료: true,
'완료(보고)': false,
취소: false,
});
@@ -82,9 +93,12 @@ export function Project() {
try {
const loginStatus = await comms.checkLoginStatus();
if (loginStatus.Success && loginStatus.IsLoggedIn && loginStatus.User) {
const userName = (loginStatus.User as { NameK?: string }).NameK || loginStatus.User.Name || '';
const user = loginStatus.User as { NameK?: string; Level?: number; Code?: string };
const userName = user.NameK || loginStatus.User.Name || '';
setCurrentUserName(userName);
setUserFilter(userName);
setUserLevel(user.Level || 0);
setUserCode(user.Code || '');
}
} catch (error) {
console.error('로그인 정보 로드 오류:', error);
@@ -155,8 +169,11 @@ export function Project() {
const filtered = projects.filter(
(p) =>
p.name?.toLowerCase().includes(key) ||
p.userManager?.toLowerCase().includes(key) ||
p.usermain?.toLowerCase().includes(key) ||
p.name_champion?.toLowerCase().includes(key) ||
p.name_design?.toLowerCase().includes(key) ||
p.name_epanel?.toLowerCase().includes(key) ||
p.name_software?.toLowerCase().includes(key) ||
p.reqstaff?.toLowerCase().includes(key) ||
p.orderno?.toLowerCase().includes(key) ||
p.memo?.toLowerCase().includes(key)
);
@@ -186,6 +203,82 @@ export function Project() {
setStatusChecks((prev) => ({ ...prev, [status]: !prev[status as keyof typeof prev] }));
};
// 히스토리 토글 (편집 아이콘 클릭)
const toggleHistory = async (projectIdx: number) => {
if (expandedProject === projectIdx) {
setExpandedProject(null);
setProjectHistory([]);
setEditingHistory(null);
} else {
setExpandedProject(projectIdx);
setLoadingHistory(true);
try {
const result = await comms.getProjectHistory(projectIdx);
if (result.Success && result.Data) {
setProjectHistory(result.Data as any[]);
} else {
setProjectHistory([]);
}
} catch (error) {
console.error('히스토리 로드 오류:', error);
setProjectHistory([]);
} finally {
setLoadingHistory(false);
}
}
};
// 히스토리 편집 시작
const startEditHistory = (history: any) => {
setEditingHistory(history);
setEditRemark(history.remark || '');
};
// 새 히스토리 추가 시작
const startAddHistory = (projectIdx: number) => {
const today = new Date().toISOString().substring(0, 10);
setEditingHistory({ pidx: projectIdx, pdate: today, progress: 0, remark: '', isNew: true });
setEditRemark('');
};
// 히스토리 저장
const saveHistory = async () => {
if (!editingHistory) return;
try {
const historyData = {
idx: editingHistory.idx || 0,
pidx: editingHistory.pidx,
pdate: editingHistory.pdate,
progress: editingHistory.progress || 0,
remark: editRemark,
};
const result = await comms.saveProjectHistory(historyData);
if (result.Success) {
// 저장 성공 후 히스토리 다시 로드
const historyResult = await comms.getProjectHistory(editingHistory.pidx);
if (historyResult.Success && historyResult.Data) {
setProjectHistory(historyResult.Data as any[]);
}
} else {
alert(result.Message || '저장에 실패했습니다.');
}
setEditingHistory(null);
setEditRemark('');
} catch (error) {
console.error('히스토리 저장 오류:', error);
}
};
// 편집 취소
const cancelEdit = () => {
setEditingHistory(null);
setEditRemark('');
};
// 페이징 계산
const totalPages = Math.ceil(filteredProjects.length / pageSize);
const paginatedProjects = filteredProjects.slice(
@@ -326,7 +419,7 @@ export function Project() {
<tr className="text-white/60 text-left">
<th className="px-3 py-2 w-16"></th>
<th className="px-3 py-2"></th>
<th className="px-3 py-2 w-20"></th>
<th className="px-3 py-2 w-20"></th>
<th className="px-3 py-2 w-28"></th>
<th className="px-3 py-2 w-20 text-center"></th>
<th className="px-3 py-2 w-24"></th>
@@ -351,33 +444,40 @@ export function Project() {
) : (
paginatedProjects.map((project) => {
const statusColor = statusColors[project.status] || { text: 'text-white', bg: 'bg-white/10' };
const isSelected = selectedProject?.idx === project.idx;
const rowBg = project.bHighlight
? 'bg-lime-500/10'
: project.bCost
? 'bg-yellow-500/10'
: project.bmajoritem
? 'bg-pink-500/10'
: '';
const isExpanded = expandedProject === project.idx;
return (
<tr
key={project.idx}
onClick={() => handleSelectProject(project)}
className={`cursor-pointer transition-colors ${rowBg} ${
isSelected ? 'bg-primary-500/20' : 'hover:bg-white/5'
}`}
>
<td className="px-3 py-2">
<span className={`px-2 py-0.5 rounded text-xs ${statusColor.bg} ${statusColor.text}`}>
{project.status}
</span>
</td>
<td className={`px-3 py-2 ${statusColor.text}`}>
<div className="truncate max-w-xs" title={project.name}>
{project.name}
</div>
</td>
<>
<tr
key={project.idx}
className={clsx(
'border-b border-white/10 cursor-pointer hover:bg-white/5',
isExpanded && 'bg-primary-900/30'
)}
onClick={() => toggleHistory(project.idx)}
>
<td className="px-3 py-2">
<span className={`px-2 py-0.5 rounded text-xs ${statusColor.bg} ${statusColor.text}`}>
{project.status}
</span>
</td>
<td className={`px-3 py-2 ${statusColor.text}`}>
<div className="truncate max-w-xs" title={project.name}>
<div className="flex items-center gap-2">
<button
onClick={e => {
e.stopPropagation();
handleSelectProject(project);
}}
className="text-primary-300 hover:text-primary-200 transition-colors"
title="편집"
>
<Edit2 className="w-4 h-4" />
</button>
<span className="font-regular text-white/90">{project.name}</span>
</div>
</div>
</td>
<td className="px-3 py-2 text-white/70">{project.name_champion || project.userManager}</td>
<td className="px-3 py-2 text-white/70 text-xs">
<div>{project.ReqLine}</div>
@@ -400,20 +500,115 @@ export function Project() {
<div className="text-white/40">{formatDate(project.edate)}</div>
</td>
<td className="px-3 py-2">
{project.jasmin && project.jasmin > 0 && (
<button
onClick={(e) => {
e.stopPropagation();
openJasmin(project.jasmin);
}}
className="text-primary-400 hover:text-primary-300"
title="자스민 열기"
<div className="flex items-center gap-2">
{project.jasmin && project.jasmin > 0 && (
<button
onClick={(e) => {
e.stopPropagation();
openJasmin(project.jasmin);
}}
className="text-primary-400 hover:text-primary-300"
title="자스민 열기"
>
<ExternalLink className="w-4 h-4" />
</button>
)}
{(userLevel >= 9 || userCode === '395552') && (
<button
onClick={(e) => {
e.stopPropagation();
const w = window as any;
if (w.CefSharp) {
w.CefSharp.BindObjectAsync('bridge').then(() => {
w.bridge?.OpenMailHistory();
});
}
}}
className="text-cyan-400 hover:text-cyan-300"
title="메일내역"
>
<Mail className="w-4 h-4" />
</button>
)}
<a
href={`#/partlist?idx=${project.idx}&name=${encodeURIComponent(project.name)}`}
onClick={(e) => e.stopPropagation()}
className="text-amber-400 hover:text-amber-300"
title="파트리스트"
>
<ExternalLink className="w-4 h-4" />
</button>
)}
<ClipboardList className="w-4 h-4" />
</a>
</div>
</td>
</tr>
{isExpanded && (
<tr key={`history-${project.idx}`}>
<td colSpan={8} className="px-3 py-2 bg-primary-950/50">
<div className="p-4">
<div className="flex items-center justify-between mb-3">
<div className="text-sm font-semibold text-primary-300"> </div>
<button
onClick={() => startAddHistory(project.idx)}
className="text-xs px-3 py-1 bg-primary-500/20 hover:bg-primary-500/30 text-primary-400 rounded transition-colors"
>
+
</button>
</div>
{loadingHistory ? (
<div className="text-white/50 text-sm"> ...</div>
) : editingHistory ? (
<div className="bg-white/10 rounded p-3 space-y-3">
<div className="flex gap-4 text-xs text-white/60">
<span className="text-primary-400 font-semibold">{formatDate(editingHistory.pdate)}</span>
<span>: {editingHistory.progress || 0}%</span>
</div>
<textarea
value={editRemark}
onChange={(e) => setEditRemark(e.target.value)}
className="w-full h-32 px-3 py-2 bg-white/5 border border-white/10 rounded text-white text-sm resize-none"
placeholder="업무 내용을 입력하세요..."
/>
<div className="flex gap-2 justify-end">
<button
onClick={cancelEdit}
className="px-3 py-1 bg-white/5 hover:bg-white/10 text-white/70 rounded text-sm transition-colors"
>
</button>
<button
onClick={saveHistory}
className="px-3 py-1 bg-primary-500/20 hover:bg-primary-500/30 text-primary-400 rounded text-sm transition-colors"
>
</button>
</div>
</div>
) : projectHistory.length > 0 ? (
<div
className="bg-white/5 rounded p-3 border-l-2 border-primary-500 cursor-pointer hover:bg-white/10 transition-colors"
onClick={() => startEditHistory(projectHistory[0])}
>
<div className="flex gap-4 mb-2 text-xs">
<span className="text-primary-400 font-semibold">{formatDate(projectHistory[0].pdate)}</span>
<span className="text-white/60">: {projectHistory[0].progress || 0}%</span>
<span className="text-white/40">{projectHistory[0].wname || ''}</span>
</div>
{projectHistory[0].remark ? (
<div className="text-sm text-white/80 whitespace-pre-wrap">{projectHistory[0].remark}</div>
) : (
<div className="text-sm text-white/40 italic"> . .</div>
)}
</div>
) : (
<div className="text-white/50 text-sm text-center py-4">
. .
</div>
)}
</div>
</td>
</tr>
)}
</>
);
})
)}
@@ -452,6 +647,8 @@ export function Project() {
onClose={handleCloseDialog}
/>
)}
</div>
);
}

View File

@@ -37,6 +37,7 @@ const getStatusClass = (status: string): string => {
const getPriorityText = (seqno: number): string => {
switch (seqno) {
case -1: return '낮음';
case 1: return '중요';
case 2: return '매우 중요';
case 3: return '긴급';
@@ -46,6 +47,7 @@ const getPriorityText = (seqno: number): string => {
const getPriorityClass = (seqno: number): string => {
switch (seqno) {
case -1: return 'bg-white/5 text-white/40';
case 1: return 'bg-primary-500/20 text-primary-300';
case 2: return 'bg-warning-500/20 text-warning-300';
case 3: return 'bg-danger-500/20 text-danger-300';
@@ -561,9 +563,22 @@ function TodoModal({
<Plus className="w-5 h-5 mr-2" />
{title}
</h2>
<button onClick={onClose} className="text-white/70 hover:text-white transition-colors">
<X className="w-6 h-6" />
</button>
<div className="flex items-center space-x-2">
{isEdit && onComplete && currentStatus !== '5' && (
<button
type="button"
onClick={onComplete}
disabled={processing}
className="bg-success-500 hover:bg-success-600 text-white px-3 py-1.5 rounded-lg transition-colors flex items-center disabled:opacity-50 text-sm"
>
<CheckCircle className="w-4 h-4 mr-1" />
</button>
)}
<button onClick={onClose} className="text-white/70 hover:text-white transition-colors">
<X className="w-6 h-6" />
</button>
</div>
</div>
{/* 내용 */}
@@ -640,10 +655,11 @@ function TodoModal({
onChange={(e) => setFormData(prev => ({ ...prev, seqno: parseInt(e.target.value) as TodoPriority }))}
className="w-full bg-white/20 backdrop-blur-sm border border-white/30 rounded-lg px-4 py-2 text-white focus:outline-none focus:ring-2 focus:ring-primary-400 transition-all"
>
<option value={0}></option>
<option value={1}></option>
<option value={2}> </option>
<option value={3}></option>
<option value={2}> </option>
<option value={1}></option>
<option value={0}></option>
<option value={-1}></option>
</select>
</div>
<div className="flex items-end">
@@ -661,42 +677,8 @@ function TodoModal({
</div>
{/* 푸터 */}
<div className="px-6 py-4 border-t border-white/10 flex justify-between">
{/* 왼쪽: 삭제 버튼 (편집 모드일 때만) */}
<div>
{isEdit && onDelete && (
<button
type="button"
onClick={onDelete}
disabled={processing}
className="bg-danger-500 hover:bg-danger-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
>
<Trash2 className="w-4 h-4 mr-2" />
</button>
)}
</div>
{/* 오른쪽: 취소, 완료, 수정 버튼 */}
<div className="px-6 py-4 border-t border-white/10 flex justify-end">
<div className="flex space-x-3">
<button
type="button"
onClick={onClose}
className="bg-white/20 hover:bg-white/30 text-white px-4 py-2 rounded-lg transition-colors"
>
</button>
{isEdit && onComplete && currentStatus !== '5' && (
<button
type="button"
onClick={onComplete}
disabled={processing}
className="bg-success-500 hover:bg-success-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
>
<CheckCircle className="w-4 h-4 mr-2" />
</button>
)}
<button
type="button"
onClick={onSubmit}
@@ -710,6 +692,17 @@ function TodoModal({
)}
{submitText}
</button>
{isEdit && onDelete && (
<button
type="button"
onClick={onDelete}
disabled={processing}
className="bg-danger-500 hover:bg-danger-600 text-white px-4 py-2 rounded-lg transition-colors flex items-center disabled:opacity-50"
>
<Trash2 className="w-4 h-4 mr-2" />
</button>
)}
</div>
</div>
</div>

View File

@@ -64,7 +64,7 @@ export interface PurchaseItem {
// 상태 관련 타입
export type TodoStatus = '0' | '1' | '2' | '3' | '5';
export type TodoPriority = 0 | 1 | 2 | 3;
export type TodoPriority = -1 | 0 | 1 | 2 | 3;
// 로그 타입
export interface LogEntry {
@@ -447,6 +447,7 @@ export interface MachineBridgeInterface {
Project_GetProcesses(): Promise<string>;
Project_GetList(statusFilter: string, category: string, process: string, userFilter: string, yearStart: string, yearEnd: string, dateType: string): Promise<string>;
Project_GetHistory(projectIdx: number): Promise<string>;
Project_SaveHistory(idx: number, pidx: number, pdate: string, progress: number, remark: string): Promise<string>;
Project_GetDailyMemo(projectIdx: number): Promise<string>;
// Note API (메모장)
@@ -462,13 +463,35 @@ export interface MachineBridgeInterface {
Board_Add(bidx: number, header: string, cate: string, title: string, contents: string): Promise<string>;
Board_Edit(idx: number, header: string, cate: string, title: string, contents: string): Promise<string>;
Board_Delete(idx: number): Promise<string>;
Board_GetReplies(rootIdx: number): Promise<string>;
Board_AddReply(rootIdx: number, pidx: number, title: string, contents: string, isComment: boolean): Promise<string>;
// Mail API (메일 발신 내역)
Mail_GetList(startDate: string, endDate: string, searchKey: string): Promise<string>;
Mail_AddData(cate: string, subject: string, fromlist: string, tolist: string, cc: string, bcc: string, body: string): Promise<string>;
Mail_SendDirect(cate: string, subject: string, fromlist: string, tolist: string, cc: string, bcc: string, body: string): Promise<string>;
Mail_SendOutlook(subject: string, tolist: string, cc: string, bcc: string, body: string): Promise<string>;
// Customs API (업체정보)
Customs_GetList(searchKey: string): Promise<string>;
Customs_GetDetail(idx: number): Promise<string>;
// License API (라이선스 관리)
License_GetList(): Promise<string>;
License_Add(name: string, version: string, meterialNo: string, supply: string, qty: number, uids: string, serialNo: string, remark: string, sdate: string, edate: string, manu: string, expire: boolean): Promise<string>;
License_Update(idx: number, name: string, version: string, meterialNo: string, supply: string, qty: number, uids: string, serialNo: string, remark: string, sdate: string, edate: string, manu: string, expire: boolean): Promise<string>;
License_Delete(idx: number): Promise<string>;
License_OpenFolder(idx: number): Promise<string>;
License_ExportCSV(filePath: string): Promise<string>;
// PartList API (파트리스트)
PartList_GetList(projectIdx: number): Promise<string>;
PartList_Save(idx: number, projectIdx: number, itemgroup: string, itemname: string, item: string, itemmodel: string, itemscale: string, itemunit: string, qty: number, price: number, itemsupply: string, itemsupplyidx: number, itemmanu: string, itemsid: string, option1: string, remark: string, no: number, qtybuy: number): Promise<string>;
PartList_Delete(idx: number): Promise<string>;
// HolidayRequest API (휴가/외출 신청)
HolidayRequest_GetList(startDate: string, endDate: string, userId: string, userLevel: number): Promise<string>;
HolidayRequest_Save(idx: number, uid: string, cate: string, sdate: string, edate: string, remark: string, response: string, conf: number, holyReason: string, holyBackup: string, holyLocation: string, holyDays: number, holyTimes: number, stime: string, etime: string): Promise<string>;
}
// 사용자 권한 정보 타입
@@ -501,6 +524,8 @@ export interface AppVersionInfo {
ProductName: string;
ProductVersion: string;
DisplayVersion: string;
MaxVersion?: string;
HasNewVersion?: boolean;
}
// 사용자 전체 정보 저장용 타입
@@ -825,6 +850,44 @@ export interface JobReportTypeItem {
count: number;
}
// 휴가/외출 신청 타입
export interface HolidayRequest {
idx: number;
gcode: string;
uid: string;
cate: string;
sdate: string;
edate: string;
Remark?: string;
wuid?: string;
wdate?: string;
dept?: string;
name?: string;
grade?: string;
tel?: string;
processs?: string;
Response?: string;
conf: number;
HolyReason?: string;
HolyBackup?: string;
HolyLocation?: string;
HolyDays?: number;
HolyTimes?: number;
sendmail?: boolean;
stime?: string;
etime?: string;
conf_id?: string;
conf_time?: string;
}
// 휴가/외출 신청 합계 타입
export interface HolidayRequestSummary {
ApprovedDays: number;
ApprovedTimes: number;
PendingDays: number;
PendingTimes: number;
}
export interface JobReportDayData {
items: JobReportDayItem[];
holidays: HolidayItem[];
@@ -849,6 +912,12 @@ export interface BoardItem {
close: boolean;
remark: string;
wuid_name: string;
root_idx?: number | null;
depth?: number;
sort_order?: number;
thread_path?: string;
is_comment?: boolean;
reply_count?: number;
}
// Mail 발신 내역 타입
@@ -887,3 +956,48 @@ export interface CustomItem {
name2: string;
gcode: string;
}
// 라이선스 타입
export interface LicenseItem {
idx?: number;
gcode?: string;
expire?: boolean;
name?: string;
version?: string;
meterialNo?: string;
supply?: string;
qty?: number;
uids?: string;
serialNo?: string;
remark?: string;
sdate?: string;
edate?: string;
manu?: string;
wuid?: string;
wdate?: string;
}
// 파트리스트 타입 (ProjectsPart 테이블)
export interface PartListItem {
idx: number;
Project: number;
itemgroup?: string;
itemname: string;
item: string; // 자재번호
itemmodel?: string;
itemscale?: string;
itemunit?: string;
qty?: number;
price?: number;
amt?: number; // 계산된 금액 (qty * price)
itemsupply?: string;
itemsupplyidx?: number;
itemmanu?: string;
itemsid?: string;
option1?: string;
remark?: string;
no?: number;
qtybuy?: number;
wuid?: string;
wdate?: string;
}

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CsvHelper" version="30.0.1" targetFramework="net46" />
<package id="EntityFramework" version="6.2.0" targetFramework="net45" />
@@ -9,6 +9,8 @@
<package id="Microsoft.ReportingServices.ReportViewerControl.Winforms" version="150.1586.0" targetFramework="net46" />
<package id="Microsoft.SqlServer.Types" version="14.0.314.76" targetFramework="net46" />
<package id="Microsoft.Web.WebView2" version="1.0.2210.55" targetFramework="net46" />
<package id="NetOfficeFw.Core" version="1.8.1" targetFramework="net46" />
<package id="NetOfficeFw.Outlook" version="1.8.1" targetFramework="net46" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net46" />
<package id="System.Buffers" version="4.5.1" targetFramework="net46" />
<package id="System.Memory" version="4.5.5" targetFramework="net46" />

View File

@@ -12,7 +12,7 @@ namespace Console_SendMail.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

View File

@@ -4,7 +4,7 @@
<Settings>
<Setting Name="gwcs" Type="(Connection string)" Scope="Application">
<DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;SerializableConnectionString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
&lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
&lt;ConnectionString&gt;Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&amp;amp;DJ+ug-D;Encrypt=False;TrustServerCertificate=True&lt;/ConnectionString&gt;
&lt;ProviderName&gt;System.Data.SqlClient&lt;/ProviderName&gt;
&lt;/SerializableConnectionString&gt;</DesignTimeValue>
@@ -12,7 +12,7 @@
</Setting>
<Setting Name="cs" Type="(Connection string)" Scope="Application">
<DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;SerializableConnectionString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
&lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
&lt;ConnectionString&gt;Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&amp;amp;DJ+ug-D;Encrypt=False;TrustServerCertificate=True&lt;/ConnectionString&gt;
&lt;/SerializableConnectionString&gt;</DesignTimeValue>
<Value Profile="(Default)">Data Source=K4FASQL.kr.ds.amkor.com,50150;Initial Catalog=EE;Persist Security Info=True;User ID=eeadm;Password=uJnU8a8q&amp;DJ+ug-D;Encrypt=False;TrustServerCertificate=True</Value>

View File

@@ -995,8 +995,8 @@ namespace Console_SendMail
//기준일자는 오늘부터 -15일이다
//var sd = DateTime.Now.AddDays(-15);
//var ed = DateTime.Now;
//var str_sd = sd.ToShortDateString();
//var str_ed = ed.ToShortDateString();
//var str_sd = sd.ToString("yyyy-MM-dd");
//var str_ed = ed.ToString("yyyy-MM-dd");
var str_dt = DateTime.Now.ToString("yyyy-MM-dd");
var sql = "select (select isnull(max(pdate),'') from ProjectsHistory where pidx = Projects.idx) as LastHistory," +
@@ -1182,7 +1182,7 @@ namespace Console_SendMail
newdr.tolist = "chikyun.kim@amkor.co.kr";
newdr.bcc = string.Empty;
newdr.cc = string.Empty;
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");//.ToShortDateString();
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");//.ToString("yyyy-MM-dd");
newdr.body = ex.Message;
newdr.wuid = "dev";// "dev";
newdr.wdate = DateTime.Now;

Submodule Sub/tcpservice updated: d7fe2baa0e...1680e266da

View File

@@ -20,7 +20,7 @@ namespace FBS0000
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
var sd = DateTime.Now.ToString("yyyy-MM-01");
var ed = DateTime.Parse(sd).AddMonths(1).AddDays(-1).ToShortDateString();// DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
var ed = DateTime.Parse(sd).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");// DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1).ToString("yyyy-MM-dd");
tbSD.Text = sd;
tbED.Text = ed;
@@ -68,7 +68,7 @@ namespace FBS0000
cols.Add(curDate.Day.ToString("00") + "\r\n" + curDate.DayOfWeek.ToString().Substring(0, 3));
coltag.Add(curDate);
if (curDate.ToShortDateString() == ed.ToShortDateString()) break;
if (curDate.ToString("yyyy-MM-dd") == ed.ToString("yyyy-MM-dd")) break;
}
cols.AddRange(new string[] { $"발생\n~{sd.AddDays(-1).ToString("MM/dd")}", "사용", $"잔여\n~{ed.ToString("MM/dd")}" });
coltag.AddRange(new DateTime[] { initdate, initdate, initdate });
@@ -159,8 +159,8 @@ namespace FBS0000
}
//이월잔액
var jand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, item.empno, sd.ToString("yyyy-01-01"), sd.AddDays(-1).ToShortDateString(), "999999", "%");
var jan = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, item.empno, sd.ToString("yyyy-01-01"), ed.ToShortDateString(), "999999", "%");
var jand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, item.empno, sd.ToString("yyyy-01-01"), sd.AddDays(-1).ToString("yyyy-MM-dd"), "999999", "%");
var jan = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, item.empno, sd.ToString("yyyy-01-01"), ed.ToString("yyyy-MM-dd"), "999999", "%");
var used = 0.0;
fpSpread1_Sheet1.Rows[rowindex].ResetBorder();
@@ -177,7 +177,7 @@ namespace FBS0000
var curDate = sd.AddDays(c - 4);
var bholy = false;
//이날짜가 휴일인지 체크한다.
var drHoly = HolyList.Where(t => t.pdate == curDate.ToShortDateString()).FirstOrDefault();
var drHoly = HolyList.Where(t => t.pdate == curDate.ToString("yyyy-MM-dd")).FirstOrDefault();
if (drHoly != null && drHoly.free)
{
@@ -209,9 +209,9 @@ namespace FBS0000
//입사일이면 메세지 추가
if (item.indate == curDate.ToShortDateString())
if (item.indate == curDate.ToString("yyyy-MM-dd"))
fpSpread1_Sheet1.Cells[rowindex, c].Note += "입사";
if (item.outdate == curDate.ToShortDateString())
if (item.outdate == curDate.ToString("yyyy-MM-dd"))
fpSpread1_Sheet1.Cells[rowindex, c].Note += "퇴사";
//현재인원값
@@ -220,16 +220,16 @@ namespace FBS0000
// Boolean usePerson = true;
//
//if (bIndate == true && curDate.ToShortDateString().CompareTo(dtIn.ToShortDateString()) < 0)
//if (bIndate == true && curDate.ToString("yyyy-MM-dd").CompareTo(dtIn.ToString("yyyy-MM-dd")) < 0)
// usePerson = false;
//if (bOutdate == true && curDate.ToShortDateString().CompareTo(dtOut.ToShortDateString()) > 0)
//if (bOutdate == true && curDate.ToString("yyyy-MM-dd").CompareTo(dtOut.ToString("yyyy-MM-dd")) > 0)
// usePerson = false;
ps[3] = bholy ? 1 : 0;
ps[2] += 1;
//근태기록에 자료가 있는지 확인한다.
var dr = dtHoly.Where(t => t.uid == item.empno && (t.term > 0 || t.CrTime > 0) && (t.sdate.ToShortDateString().CompareTo(curDate.ToShortDateString()) <= 0 && t.edate.ToShortDateString().CompareTo(curDate.ToShortDateString()) >= 0)).FirstOrDefault();
var dr = dtHoly.Where(t => t.uid == item.empno && (t.term > 0 || t.CrTime > 0) && (t.sdate.ToString("yyyy-MM-dd").CompareTo(curDate.ToString("yyyy-MM-dd")) <= 0 && t.edate.ToString("yyyy-MM-dd").CompareTo(curDate.ToString("yyyy-MM-dd")) >= 0)).FirstOrDefault();
if (dr != null && fpSpread1_Sheet1.Cells[rowindex, c].Tag == null) //휴일이 아니여야 한다
{
@@ -263,7 +263,7 @@ namespace FBS0000
}
//근태 시작일자가 조회시작일보다 적다면, 데이터가 걸쳐진 것이므로 회색으로 처리하자 2308320
if (dr.sdate.ToShortDateString().CompareTo(sd.ToShortDateString()) < 0)
if (dr.sdate.ToString("yyyy-MM-dd").CompareTo(sd.ToString("yyyy-MM-dd")) < 0)
{
fpSpread1_Sheet1.Cells[rowindex, c].BackColor = Color.DimGray;
fpSpread1_Sheet1.Cells[rowindex, c].ForeColor = Color.White;
@@ -271,11 +271,11 @@ namespace FBS0000
if (string.IsNullOrEmpty(dr.contents) == false)
{
fpSpread1_Sheet1.Cells[rowindex, c].Note += $"({dr.cate}){dr.contents} 기간:{dr.sdate.ToShortDateString()}~{dr.edate.ToShortDateString()}";
fpSpread1_Sheet1.Cells[rowindex, c].Note += $"({dr.cate}){dr.contents} 기간:{dr.sdate.ToString("yyyy-MM-dd")}~{dr.edate.ToString("yyyy-MM-dd")}";
}
else if (dr.sdate.ToShortDateString() != dr.edate.ToShortDateString())
else if (dr.sdate.ToString("yyyy-MM-dd") != dr.edate.ToString("yyyy-MM-dd"))
{
fpSpread1_Sheet1.Cells[rowindex, c].Note += $"({dr.cate}) 기간:{dr.sdate.ToShortDateString()}~{dr.edate.ToShortDateString()}";
fpSpread1_Sheet1.Cells[rowindex, c].Note += $"({dr.cate}) 기간:{dr.sdate.ToString("yyyy-MM-dd")}~{dr.edate.ToString("yyyy-MM-dd")}";
}
//else fpSpread1_Sheet1.Cells[rowindex, c].Note = string.Empty;
}
@@ -284,7 +284,7 @@ namespace FBS0000
ps[0] += 1;
var pdate = curDate.ToShortDateString();
var pdate = curDate.ToString("yyyy-MM-dd");
if (pdate == "2022-02-07" && item.empno == "66630")
{
@@ -335,7 +335,7 @@ namespace FBS0000
var celltag = fpSpread1_Sheet1.Cells[rowindex, c].Tag;
if (celltag == null) //다른곳에서 지정했다면 처리하지 않는다.
{
if (DateTime.Now.ToShortDateString().CompareTo(pdate) > 0)
if (DateTime.Now.ToString("yyyy-MM-dd").CompareTo(pdate) > 0)
{
fpSpread1_Sheet1.Cells[rowindex, c].Value = "--";
fpSpread1_Sheet1.Cells[rowindex, c].ForeColor = Color.Red;
@@ -482,8 +482,8 @@ namespace FBS0000
var f = new FCOMMON.fSelectMonth();
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
var sdDate = DateTime.Parse(DateTime.Now.ToString("yyyy-") + f.selectmon.ToString() + "-01");
tbSD.Text = sdDate.ToShortDateString();
tbED.Text = sdDate.AddMonths(1).AddDays(-1).ToShortDateString();
tbSD.Text = sdDate.ToString("yyyy-MM-dd");
tbED.Text = sdDate.AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
this.RefreshData();
}
@@ -517,8 +517,8 @@ namespace FBS0000
var sd = DateTime.Parse(DateTime.Parse(tbSD.Text).ToString("yyyy-MM-01"));
sd = sd.AddMonths(-1);
var ed = sd.AddMonths(1).AddDays(-1);
tbSD.Text = sd.ToShortDateString();
tbED.Text = ed.ToShortDateString();
tbSD.Text = sd.ToString("yyyy-MM-dd");
tbED.Text = ed.ToString("yyyy-MM-dd");
}
private void toolStripButton5_Click(object sender, EventArgs e)
@@ -526,8 +526,8 @@ namespace FBS0000
var sd = DateTime.Parse(DateTime.Parse(tbSD.Text).ToString("yyyy-MM-01"));
sd = sd.AddMonths(1);
var ed = sd.AddMonths(1).AddDays(-1);
tbSD.Text = sd.ToShortDateString();
tbED.Text = ed.ToShortDateString();
tbSD.Text = sd.ToString("yyyy-MM-dd");
tbED.Text = ed.ToString("yyyy-MM-dd");
}
private void btXls_Click(object sender, EventArgs e)

View File

@@ -20,7 +20,7 @@ namespace FBS0000.Holiday
//dtSD.KeyDown += dtSD_KeyDown;
//dtED.KeyDown += dtSD_KeyDown;
tbDate.Text = DateTime.Now.ToShortDateString();
tbDate.Text = DateTime.Now.ToString("yyyy-MM-dd");
}
private void fErrorChk_Load(object sender, EventArgs e)
{
@@ -63,7 +63,7 @@ namespace FBS0000.Holiday
{
var CD = sd.AddDays(idx++);
if (CD > ed) break;
var pdate = CD.ToShortDateString();
var pdate = CD.ToString("yyyy-MM-dd");
tbDate.Text = pdate;
Application.DoEvents();
@@ -383,7 +383,7 @@ namespace FBS0000.Holiday
var CD = DateTime.Parse(lv.SubItems[0].Text);
//if (CD > ed) break;
var pdate = CD.ToShortDateString();
var pdate = CD.ToString("yyyy-MM-dd");
cmd.Parameters["pdate"].Value = pdate;
tbDate.Text = pdate;
Application.DoEvents();

View File

@@ -31,7 +31,7 @@ namespace FBS0000
if (cmbUser.SelectedIndex < 0)
cmbUser.SelectedIndex = 0;
this.tbMon.Text = DateTime.Now.ToShortDateString();
this.tbMon.Text = DateTime.Now.ToString("yyyy-MM-dd");
cmbType.SelectedIndex = 0; //일기준으로한다
int curLevel = Math.Max(FCOMMON.info.Login.level, FCOMMON.DBM.getAuth(FCOMMON.DBM.eAuthType.holyday));
if (curLevel < 5) cmbUser.Enabled = false;
@@ -68,12 +68,12 @@ namespace FBS0000
var uid = GetUIDValue();
if (cmbType.SelectedIndex == 0)
{
taDay.Fill(this.dsReport.Holydata_Day, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
taDay.Fill(this.dsReport.Holydata_Day, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
//this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", bsDay));
}
else if (cmbType.SelectedIndex == 1) //대체
{
taTime.Fill(this.dsReport.Holydata_Time, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
taTime.Fill(this.dsReport.Holydata_Time, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
dsReport.Holydata_Day.Clear();
dsReport.Holydata_Day.Merge(dsReport.Holydata_Time);
dsReport.Holydata_Day.AcceptChanges();
@@ -82,7 +82,7 @@ namespace FBS0000
else //PMS
{
var tapms = new dsReportTableAdapters.Holydata_TimePMSTableAdapter();
tapms.Fill(this.dsReport.Holydata_TimePMS, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
tapms.Fill(this.dsReport.Holydata_TimePMS, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
dsReport.Holydata_Day.Clear();
dsReport.Holydata_Day.Merge(dsReport.Holydata_TimePMS);
dsReport.Holydata_Day.AcceptChanges();
@@ -140,14 +140,14 @@ namespace FBS0000
{
var sdo = DateTime.Parse(this.tbMon.Text);
var sd = sdo.AddMonths(-1);
tbMon.Text = sd.ToShortDateString();
tbMon.Text = sd.ToString("yyyy-MM-dd");
}
private void toolStripButton7_Click(object sender, EventArgs e)
{
var sdo = DateTime.Parse(this.tbMon.Text);
var sd = sdo.AddMonths(1);
tbMon.Text = sd.ToShortDateString();
tbMon.Text = sd.ToString("yyyy-MM-dd");
}
private void reportViewer1_Load(object sender, EventArgs e)

View File

@@ -30,7 +30,7 @@ namespace FBS0000
//if (cmbUser.SelectedIndex < 0)
// cmbUser.SelectedIndex = 0;
this.tbMon.Text = DateTime.Now.ToShortDateString();
this.tbMon.Text = DateTime.Now.ToString("yyyy-MM-dd");
cmbType.SelectedIndex = 0; //일기준으로한다
}
@@ -79,15 +79,15 @@ namespace FBS0000
var sd = DateTime.Parse(ed.ToString("yyyy") + "-01-01");
int curLevel = Math.Max(FCOMMON.info.Login.level, FCOMMON.DBM.getAuth(FCOMMON.DBM.eAuthType.holyday));
var uid = curLevel > 5 ? "%" : FCOMMON.info.Login.no; // GetUIDValue();
var uid = curLevel >= 5 ? "%" : FCOMMON.info.Login.no; // GetUIDValue();
if (cmbType.SelectedIndex == 0)
{
taDay.Fill(this.dsReport.Holydata_Day, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
taDay.Fill(this.dsReport.Holydata_Day, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
//this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", bsDay));
}
else if(cmbType.SelectedIndex == 1)
{
taTime.Fill(this.dsReport.Holydata_Time, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
taTime.Fill(this.dsReport.Holydata_Time, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
dsReport.Holydata_Day.Clear();
dsReport.Holydata_Day.Merge(dsReport.Holydata_Time);
dsReport.Holydata_Day.AcceptChanges();
@@ -96,7 +96,7 @@ namespace FBS0000
else //pms
{
var taPMS = new dsReportTableAdapters.Holydata_TimePMSTableAdapter();
taPMS.Fill(this.dsReport.Holydata_TimePMS, FCOMMON.info.Login.gcode, uid, sd.ToShortDateString(), ed.ToShortDateString());
taPMS.Fill(this.dsReport.Holydata_TimePMS, FCOMMON.info.Login.gcode, uid, sd.ToString("yyyy-MM-dd"), ed.ToString("yyyy-MM-dd"));
dsReport.Holydata_Day.Clear();
dsReport.Holydata_Day.Merge(dsReport.Holydata_TimePMS);
dsReport.Holydata_Day.AcceptChanges();
@@ -151,14 +151,14 @@ namespace FBS0000
{
var sdo = DateTime.Parse(this.tbMon.Text);
var sd = sdo.AddMonths(-1);
tbMon.Text = sd.ToShortDateString();
tbMon.Text = sd.ToString("yyyy-MM-dd");
}
private void toolStripButton7_Click(object sender, EventArgs e)
{
var sdo = DateTime.Parse(this.tbMon.Text);
var sd = sdo.AddMonths(1);
tbMon.Text = sd.ToShortDateString();
tbMon.Text = sd.ToString("yyyy-MM-dd");
}
private void reportViewer1_Load(object sender, EventArgs e)

View File

@@ -45,7 +45,7 @@ namespace FBS0000
im2.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextColumnWrap);
dtSD.Text = DateTime.Now.ToString("yyyy-MM") + "-01";
dtED.Text = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01").AddDays(-1).ToShortDateString();
dtED.Text = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01").AddDays(-1).ToString("yyyy-MM-dd");
//현재 사용자의 그룹명을 가져옴
var taQuery = new dsMSSQLTableAdapters.QueriesTableAdapter();
@@ -137,7 +137,7 @@ namespace FBS0000
var sd = DateTime.Parse(dtSD.Text + " 00:00:00");
var ed = DateTime.Parse(dtED.Text + " 23:59:59");
//sd = DateTime.Parse(ed.ToString("yyyy-01-01 00:00:00"));
//this.tbSD.Text = sd.ToShortDateString();
//this.tbSD.Text = sd.ToString("yyyy-MM-dd");
try
{
@@ -188,8 +188,8 @@ namespace FBS0000
var fistdate = dr.sdate.ToString("yyyy-01-01");
//이 사용자의 이전까지의 잔량을 가져온다
var yjand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToShortDateString(), dr.idx.ToString("000000"),"%");
var yjanh = qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToShortDateString(), dr.idx.ToString("000000"));
var yjand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToString("yyyy-MM-dd"), dr.idx.ToString("000000"),"%");
var yjanh = qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToString("yyyy-MM-dd"), dr.idx.ToString("000000"));
var jand = yjand + dr.termDr - dr.term;
var janh = yjanh + dr.DrTime - dr.CrTime;
this.fpSpread1.ActiveSheet.Cells[i, col_yjand].Value = yjand;
@@ -298,8 +298,8 @@ namespace FBS0000
////이 사용자의 이전까지의 잔량을 가져온다
//var fistdate = newdr.sdate.ToString("yyyy-01-01");
//var yjand = 0;// qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, this.seluid, fistdate, newdr.sdate.ToShortDateString(),"999999");
//var yjanh = 0;// qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, seluid, fistdate, newdr.sdate.ToShortDateString(), "999999");
//var yjand = 0;// qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, this.seluid, fistdate, newdr.sdate.ToString("yyyy-MM-dd"),"999999");
//var yjanh = 0;// qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, seluid, fistdate, newdr.sdate.ToString("yyyy-MM-dd"), "999999");
@@ -586,8 +586,8 @@ namespace FBS0000
var f = new FCOMMON.fSelectMonth();
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
var sdDate = DateTime.Parse(DateTime.Now.ToString("yyyy-") + f.selectmon.ToString() + "-01");
dtSD.Text = sdDate.ToShortDateString();
dtED.Text = sdDate.AddMonths(1).AddDays(-1).ToShortDateString();
dtSD.Text = sdDate.ToString("yyyy-MM-dd");
dtED.Text = sdDate.AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
this.RefreshData();
}
@@ -702,7 +702,7 @@ namespace FBS0000
{
var f = new FCOMMON.fSelectDay(DateTime.Parse(dtED.Text));
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
dtED.Text = f.dtPick.SelectionStart.ToShortDateString();
dtED.Text = f.dtPick.SelectionStart.ToString("yyyy-MM-dd");
}
private void toolStripButton8_Click(object sender, EventArgs e)
@@ -710,8 +710,8 @@ namespace FBS0000
var sdo = DateTime.Parse(dtSD.Text);
var sd = DateTime.Parse(sdo.AddMonths(-1).ToString("yyyy-MM-01"));
var ed = sd.AddMonths(1).AddDays(-1);
dtSD.Text = sd.ToShortDateString();
dtED.Text = ed.ToShortDateString();
dtSD.Text = sd.ToString("yyyy-MM-dd");
dtED.Text = ed.ToString("yyyy-MM-dd");
}
private void toolStripButton9_Click(object sender, EventArgs e)
@@ -719,8 +719,8 @@ namespace FBS0000
var sdo = DateTime.Parse(dtSD.Text);
var sd = DateTime.Parse(sdo.AddMonths(1).ToString("yyyy-MM-01"));
var ed = sd.AddMonths(1).AddDays(-1);
dtSD.Text = sd.ToShortDateString();
dtED.Text = ed.ToShortDateString();
dtSD.Text = sd.ToString("yyyy-MM-dd");
dtED.Text = ed.ToString("yyyy-MM-dd");
}
private void toolStripLabel3_Click(object sender, EventArgs e)

View File

@@ -169,7 +169,6 @@
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.EETGW_WorkTableUserTableAdapter = null;
this.tam.HolidayLIstTableAdapter = null;
this.tam.HolydayTableAdapter = this.ta;

View File

@@ -70,7 +70,7 @@ namespace FBS0000.Holiday
if (buffer.Length > 6) crtime = buffer[6].Trim();
float.TryParse(crtime, out float val_crtime);
var lv = this.listView1.Items.Add(val_date.ToShortDateString());
var lv = this.listView1.Items.Add(val_date.ToString("yyyy-MM-dd"));
lv.SubItems.Add(vno);
lv.SubItems.Add(vcate);
lv.SubItems.Add(drday.ToString());

View File

@@ -47,8 +47,8 @@ namespace FBS0000.Holiday
cn.Open();
var cmd = new System.Data.SqlClient.SqlCommand("", cn);
cmd.Parameters.Add("gcode", SqlDbType.VarChar).Value = gcode;
cmd.Parameters.Add("sd", SqlDbType.VarChar).Value = stime.ToShortDateString();
cmd.Parameters.Add("ed", SqlDbType.VarChar).Value = etime.ToShortDateString();
cmd.Parameters.Add("sd", SqlDbType.VarChar).Value = stime.ToString("yyyy-MM-dd");
cmd.Parameters.Add("ed", SqlDbType.VarChar).Value = etime.ToString("yyyy-MM-dd");
//근태입력자료확인
cmd.CommandText = "SELECT holyday.uid, Users.name,\r\nsum( Holyday.DrTime) AS Dr," +
@@ -128,7 +128,7 @@ namespace FBS0000.Holiday
}
var ed = dateTimePicker1.Value;
if (UTIL.MsgQ($"{chkitems.Count}건의 자료를 {ed.ToShortDateString()}일자로 등록할까요?\n구분은 '대체'로 입력됩니다") != DialogResult.Yes)
if (UTIL.MsgQ($"{chkitems.Count}건의 자료를 {ed.ToString("yyyy-MM-dd")}일자로 등록할까요?\n구분은 '대체'로 입력됩니다") != DialogResult.Yes)
return;
var sumjan = 0.0;

View File

@@ -45,7 +45,7 @@ namespace FBS0000
im2.Put(new FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextColumnWrap);
dtSD.Text = DateTime.Now.ToString("yyyy") + "-01-01";
dtED.Text = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01").AddDays(-1).ToShortDateString();
dtED.Text = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM") + "-01").AddDays(-1).ToString("yyyy-MM-dd");
//현재 사용자의 그룹명을 가져옴
var taQuery = new dsMSSQLTableAdapters.QueriesTableAdapter();
@@ -134,7 +134,7 @@ namespace FBS0000
var sd = DateTime.Parse(dtSD.Text + " 00:00:00");
var ed = DateTime.Parse(dtED.Text + " 23:59:59");
//sd = DateTime.Parse(ed.ToString("yyyy-01-01 00:00:00"));
//this.tbSD.Text = sd.ToShortDateString();
//this.tbSD.Text = sd.ToString("yyyy-MM-dd");
try
{
@@ -185,8 +185,8 @@ namespace FBS0000
var fistdate = dr.sdate.ToString("yyyy-01-01");
//이 사용자의 이전까지의 잔량을 가져온다
var yjand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToShortDateString(), dr.idx.ToString("000000"),"년차");
//var yjanh = qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToShortDateString(), dr.idx.ToString("000000"));
var yjand = qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToString("yyyy-MM-dd"), dr.idx.ToString("000000"),"년차");
//var yjanh = qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, dr.uid, fistdate, dr.sdate.ToString("yyyy-MM-dd"), dr.idx.ToString("000000"));
var jand = yjand + dr.termDr - dr.term;
//var janh = yjanh + dr.DrTime - dr.CrTime;
this.fpSpread1.ActiveSheet.Cells[i, col_jand].Value = jand;
@@ -295,8 +295,8 @@ namespace FBS0000
////이 사용자의 이전까지의 잔량을 가져온다
//var fistdate = newdr.sdate.ToString("yyyy-01-01");
//var yjand = 0;// qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, this.seluid, fistdate, newdr.sdate.ToShortDateString(),"999999");
//var yjanh = 0;// qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, seluid, fistdate, newdr.sdate.ToShortDateString(), "999999");
//var yjand = 0;// qta.WorkUserJan_Yesterday_Day(FCOMMON.info.Login.gcode, this.seluid, fistdate, newdr.sdate.ToString("yyyy-MM-dd"),"999999");
//var yjanh = 0;// qta.WorkUserJan_YesterDay_Time(FCOMMON.info.Login.gcode, seluid, fistdate, newdr.sdate.ToString("yyyy-MM-dd"), "999999");
@@ -417,7 +417,7 @@ namespace FBS0000
private void toolStripButton5_Click(object sender, EventArgs e)
{
//var sd = DateTime.Now.ToString("yyyy-MM-01");
//var ed = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
//var ed = DateTime.Parse(DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1).ToString("yyyy-MM-dd");
var f = new WorkTable();
f.Show();
}
@@ -579,8 +579,8 @@ namespace FBS0000
var f = new FCOMMON.fSelectMonth();
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
var sdDate = DateTime.Parse(DateTime.Now.ToString("yyyy-") + f.selectmon.ToString() + "-01");
dtSD.Text = sdDate.ToShortDateString();
dtED.Text = sdDate.AddMonths(1).AddDays(-1).ToShortDateString();
dtSD.Text = sdDate.ToString("yyyy-MM-dd");
dtED.Text = sdDate.AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
this.RefreshData();
}
@@ -695,7 +695,7 @@ namespace FBS0000
{
var f = new FCOMMON.fSelectDay(DateTime.Parse(dtED.Text));
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
dtED.Text = f.dtPick.SelectionStart.ToShortDateString();
dtED.Text = f.dtPick.SelectionStart.ToString("yyyy-MM-dd");
}
private void toolStripButton8_Click(object sender, EventArgs e)
@@ -703,8 +703,8 @@ namespace FBS0000
var sdo = DateTime.Parse(dtSD.Text);
var sd = DateTime.Parse(sdo.AddMonths(-1).ToString("yyyy-MM-01"));
var ed = sd.AddMonths(1).AddDays(-1);
dtSD.Text = sd.ToShortDateString();
dtED.Text = ed.ToShortDateString();
dtSD.Text = sd.ToString("yyyy-MM-dd");
dtED.Text = ed.ToString("yyyy-MM-dd");
}
private void toolStripButton9_Click(object sender, EventArgs e)
@@ -712,8 +712,8 @@ namespace FBS0000
var sdo = DateTime.Parse(dtSD.Text);
var sd = DateTime.Parse(sdo.AddMonths(1).ToString("yyyy-MM-01"));
var ed = sd.AddMonths(1).AddDays(-1);
dtSD.Text = sd.ToShortDateString();
dtED.Text = ed.ToShortDateString();
dtSD.Text = sd.ToString("yyyy-MM-dd");
dtED.Text = ed.ToString("yyyy-MM-dd");
}
private void toolStripLabel3_Click(object sender, EventArgs e)

View File

@@ -28,7 +28,7 @@ namespace FBS0000
{
EnsureVisibleAndUsableSize();
this.tbMon.Text = DateTime.Now.ToShortDateString();
this.tbMon.Text = DateTime.Now.ToString("yyyy-MM-dd");
refrehData();
// this.reportViewer1.RefreshReport();
@@ -38,7 +38,7 @@ namespace FBS0000
{
var dt = DateTime.Parse(this.tbMon.Text);
ta.Fill(this.dsReport.holydata, FCOMMON.info.Login.gcode, dt.Year.ToString("0000") + "-01-01", dt.ToShortDateString());
ta.Fill(this.dsReport.holydata, FCOMMON.info.Login.gcode, dt.Year.ToString("0000") + "-01-01", dt.ToString("yyyy-MM-dd"));
//데이터를 재 집계한다.
this.dsReport.holydatasum.Clear();
@@ -385,14 +385,14 @@ namespace FBS0000
{
var sdo = DateTime.Parse(this.tbMon.Text);
var sd = sdo.AddMonths(-1);
tbMon.Text = sd.ToShortDateString();
tbMon.Text = sd.ToString("yyyy-MM-dd");
}
private void toolStripButton7_Click(object sender, EventArgs e)
{
var sdo = DateTime.Parse(this.tbMon.Text);
var sd = sdo.AddMonths(1);
tbMon.Text = sd.ToShortDateString();
tbMon.Text = sd.ToString("yyyy-MM-dd");
}
private void reportViewer1_Load(object sender, EventArgs e)

File diff suppressed because it is too large Load Diff

View File

@@ -128,107 +128,6 @@ WHERE (idx = @idx)</CommandText>
</DbSource>
</Sources>
</TableAdapter>
<TableAdapter BaseClass="System.ComponentModel.Component" DataAccessorModifier="AutoLayout, AnsiClass, Class, Public" DataAccessorName="BoardTableAdapter" GeneratorDataComponentClassName="BoardTableAdapter" Name="Board" UserDataComponentName="BoardTableAdapter">
<MainSource>
<DbSource ConnectionRef="gwcs (Settings)" DbObjectName="EE.dbo.Board" DbObjectType="Table" FillMethodModifier="Public" FillMethodName="Fill" GenerateMethods="Both" GenerateShortCommands="true" GeneratorGetMethodName="GetData" GeneratorSourceName="Fill" GetMethodModifier="Public" GetMethodName="GetData" QueryType="Rowset" ScalarCallRetval="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetData" UserSourceName="Fill">
<DeleteCommand>
<DbCommand CommandType="Text" ModifiedByUser="false">
<CommandText>DELETE FROM [Board] WHERE (([idx] = @Original_idx) AND ((@IsNull_bidx = 1 AND [bidx] IS NULL) OR ([bidx] = @Original_bidx)) AND ((@IsNull_header = 1 AND [header] IS NULL) OR ([header] = @Original_header)) AND ((@IsNull_cate = 1 AND [cate] IS NULL) OR ([cate] = @Original_cate)) AND ((@IsNull_title = 1 AND [title] IS NULL) OR ([title] = @Original_title)) AND ((@IsNull_file = 1 AND [file] IS NULL) OR ([file] = @Original_file)) AND ((@IsNull_guid = 1 AND [guid] IS NULL) OR ([guid] = @Original_guid)) AND ([wuid] = @Original_wuid) AND ([wdate] = @Original_wdate))</CommandText>
<Parameters>
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_idx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="idx" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_header" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Boolean" Direction="Input" ParameterName="@Original_header" Precision="0" ProviderType="Bit" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_cate" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_cate" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_title" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_title" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_file" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_file" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_guid" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_guid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_wuid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="wuid" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="DateTime" Direction="Input" ParameterName="@Original_wdate" Precision="0" ProviderType="DateTime" Scale="0" Size="0" SourceColumn="wdate" SourceColumnNullMapping="false" SourceVersion="Original" />
</Parameters>
</DbCommand>
</DeleteCommand>
<InsertCommand>
<DbCommand CommandType="Text" ModifiedByUser="false">
<CommandText>INSERT INTO [Board] ([bidx], [header], [cate], [title], [contents], [file], [guid], [wuid], [wdate]) VALUES (@bidx, @header, @cate, @title, @contents, @file, @guid, @wuid, @wdate);
SELECT idx, bidx, header, cate, title, contents, [file], guid, wuid, wdate FROM Board WHERE (idx = SCOPE_IDENTITY())</CommandText>
<Parameters>
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Boolean" Direction="Input" ParameterName="@header" Precision="0" ProviderType="Bit" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@cate" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@title" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@contents" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="contents" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@file" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@guid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@wuid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="wuid" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="DateTime" Direction="Input" ParameterName="@wdate" Precision="0" ProviderType="DateTime" Scale="0" Size="0" SourceColumn="wdate" SourceColumnNullMapping="false" SourceVersion="Current" />
</Parameters>
</DbCommand>
</InsertCommand>
<SelectCommand>
<DbCommand CommandType="Text" ModifiedByUser="false">
<CommandText>SELECT idx, bidx, header, cate, title, contents, [file], guid, wuid, wdate
FROM Board WITH (NOLOCK)
WHERE (bidx = @bidx)</CommandText>
<Parameters>
<Parameter AllowDbNull="true" AutogeneratedName="bidx" ColumnName="bidx" DataSourceName="EE.dbo.Board" DataTypeServer="int" DbType="Int32" Direction="Input" ParameterName="@bidx" Precision="0" ProviderType="Int" Scale="0" Size="4" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Current" />
</Parameters>
</DbCommand>
</SelectCommand>
<UpdateCommand>
<DbCommand CommandType="Text" ModifiedByUser="false">
<CommandText>UPDATE [Board] SET [bidx] = @bidx, [header] = @header, [cate] = @cate, [title] = @title, [contents] = @contents, [file] = @file, [guid] = @guid, [wuid] = @wuid, [wdate] = @wdate WHERE (([idx] = @Original_idx) AND ((@IsNull_bidx = 1 AND [bidx] IS NULL) OR ([bidx] = @Original_bidx)) AND ((@IsNull_header = 1 AND [header] IS NULL) OR ([header] = @Original_header)) AND ((@IsNull_cate = 1 AND [cate] IS NULL) OR ([cate] = @Original_cate)) AND ((@IsNull_title = 1 AND [title] IS NULL) OR ([title] = @Original_title)) AND ((@IsNull_file = 1 AND [file] IS NULL) OR ([file] = @Original_file)) AND ((@IsNull_guid = 1 AND [guid] IS NULL) OR ([guid] = @Original_guid)) AND ([wuid] = @Original_wuid) AND ([wdate] = @Original_wdate));
SELECT idx, bidx, header, cate, title, contents, [file], guid, wuid, wdate FROM Board WHERE (idx = @idx)</CommandText>
<Parameters>
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Boolean" Direction="Input" ParameterName="@header" Precision="0" ProviderType="Bit" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@cate" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@title" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@contents" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="contents" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@file" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@guid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@wuid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="wuid" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="DateTime" Direction="Input" ParameterName="@wdate" Precision="0" ProviderType="DateTime" Scale="0" Size="0" SourceColumn="wdate" SourceColumnNullMapping="false" SourceVersion="Current" />
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_idx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="idx" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_bidx" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="bidx" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_header" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Boolean" Direction="Input" ParameterName="@Original_header" Precision="0" ProviderType="Bit" Scale="0" Size="0" SourceColumn="header" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_cate" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_cate" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="cate" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_title" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_title" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="title" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_file" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_file" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="file" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_guid" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="true" SourceVersion="Original" />
<Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_guid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="guid" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiString" Direction="Input" ParameterName="@Original_wuid" Precision="0" ProviderType="VarChar" Scale="0" Size="0" SourceColumn="wuid" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="DateTime" Direction="Input" ParameterName="@Original_wdate" Precision="0" ProviderType="DateTime" Scale="0" Size="0" SourceColumn="wdate" SourceColumnNullMapping="false" SourceVersion="Original" />
<Parameter AllowDbNull="false" AutogeneratedName="idx" ColumnName="idx" DataSourceName="" DataTypeServer="int" DbType="Int32" Direction="Input" ParameterName="@idx" Precision="0" ProviderType="Int" Scale="0" Size="4" SourceColumn="idx" SourceColumnNullMapping="false" SourceVersion="Current" />
</Parameters>
</DbCommand>
</UpdateCommand>
</DbSource>
</MainSource>
<Mappings>
<Mapping SourceColumn="idx" DataSetColumn="idx" />
<Mapping SourceColumn="bidx" DataSetColumn="bidx" />
<Mapping SourceColumn="header" DataSetColumn="header" />
<Mapping SourceColumn="cate" DataSetColumn="cate" />
<Mapping SourceColumn="title" DataSetColumn="title" />
<Mapping SourceColumn="contents" DataSetColumn="contents" />
<Mapping SourceColumn="file" DataSetColumn="file" />
<Mapping SourceColumn="guid" DataSetColumn="guid" />
<Mapping SourceColumn="wuid" DataSetColumn="wuid" />
<Mapping SourceColumn="wdate" DataSetColumn="wdate" />
</Mappings>
<Sources />
</TableAdapter>
<TableAdapter BaseClass="System.ComponentModel.Component" DataAccessorModifier="AutoLayout, AnsiClass, Class, Public" DataAccessorName="HolydayTableAdapter" GeneratorDataComponentClassName="HolydayTableAdapter" Name="Holyday" UserDataComponentName="HolydayTableAdapter">
<MainSource>
<DbSource ConnectionRef="gwcs (Settings)" DbObjectName="EE.dbo.Holyday" DbObjectType="Table" FillMethodModifier="Public" FillMethodName="Fill" GenerateMethods="Both" GenerateShortCommands="true" GeneratorGetMethodName="GetData" GeneratorSourceName="Fill" GetMethodModifier="Public" GetMethodName="GetData" QueryType="Rowset" ScalarCallRetval="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetData" UserSourceName="Fill">
@@ -908,527 +807,475 @@ WHERE (gcode = @gcode) AND (uid = @uid) AND (CONVERT(CHAR(10), sdate, 23) &gt;=
</DataSource>
</xs:appinfo>
</xs:annotation>
<xs:element name="dsMSSQL" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_UserDSName="dsMSSQL" msprop:EnableTableAdapterManager="true" msprop:Generator_DataSetName="dsMSSQL">
<xs:element name="dsMSSQL" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:EnableTableAdapterManager="true" msprop:Generator_DataSetName="dsMSSQL" msprop:Generator_UserDSName="dsMSSQL">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="minutes" msprop:Generator_RowEvHandlerName="minutesRowChangeEventHandler" msprop:Generator_RowDeletedName="minutesRowDeleted" msprop:Generator_RowDeletingName="minutesRowDeleting" msprop:Generator_RowEvArgName="minutesRowChangeEvent" msprop:Generator_TablePropName="minutes" msprop:Generator_RowChangedName="minutesRowChanged" msprop:Generator_UserTableName="minutes" msprop:Generator_RowChangingName="minutesRowChanging" msprop:Generator_RowClassName="minutesRow" msprop:Generator_TableClassName="minutesDataTable" msprop:Generator_TableVarName="tableminutes">
<xs:element name="minutes" msprop:Generator_UserTableName="minutes" msprop:Generator_RowEvArgName="minutesRowChangeEvent" msprop:Generator_TableVarName="tableminutes" msprop:Generator_TablePropName="minutes" msprop:Generator_RowDeletingName="minutesRowDeleting" msprop:Generator_RowChangingName="minutesRowChanging" msprop:Generator_RowDeletedName="minutesRowDeleted" msprop:Generator_RowEvHandlerName="minutesRowChangeEventHandler" msprop:Generator_TableClassName="minutesDataTable" msprop:Generator_RowChangedName="minutesRowChanged" msprop:Generator_RowClassName="minutesRow">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
<xs:element name="stime" msprop:Generator_ColumnPropNameInTable="stimeColumn" msprop:Generator_ColumnPropNameInRow="stime" msprop:Generator_UserColumnName="stime" msprop:Generator_ColumnVarNameInTable="columnstime" type="xs:dateTime" minOccurs="0" />
<xs:element name="etime" msprop:Generator_ColumnPropNameInTable="etimeColumn" msprop:Generator_ColumnPropNameInRow="etime" msprop:Generator_UserColumnName="etime" msprop:Generator_ColumnVarNameInTable="columnetime" type="xs:dateTime" minOccurs="0" />
<xs:element name="title" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_UserColumnName="title" msprop:Generator_ColumnVarNameInTable="columntitle" minOccurs="0">
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
<xs:element name="stime" msprop:Generator_ColumnVarNameInTable="columnstime" msprop:Generator_ColumnPropNameInRow="stime" msprop:Generator_ColumnPropNameInTable="stimeColumn" msprop:Generator_UserColumnName="stime" type="xs:dateTime" minOccurs="0" />
<xs:element name="etime" msprop:Generator_ColumnVarNameInTable="columnetime" msprop:Generator_ColumnPropNameInRow="etime" msprop:Generator_ColumnPropNameInTable="etimeColumn" msprop:Generator_UserColumnName="etime" type="xs:dateTime" minOccurs="0" />
<xs:element name="title" msprop:Generator_ColumnVarNameInTable="columntitle" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:Generator_UserColumnName="title" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="place" msprop:Generator_ColumnPropNameInTable="placeColumn" msprop:Generator_ColumnPropNameInRow="place" msprop:Generator_UserColumnName="place" msprop:Generator_ColumnVarNameInTable="columnplace" minOccurs="0">
<xs:element name="place" msprop:Generator_ColumnVarNameInTable="columnplace" msprop:Generator_ColumnPropNameInRow="place" msprop:Generator_ColumnPropNameInTable="placeColumn" msprop:Generator_UserColumnName="place" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="contents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_UserColumnName="contents" msprop:Generator_ColumnVarNameInTable="columncontents" minOccurs="0">
<xs:element name="contents" msprop:Generator_ColumnVarNameInTable="columncontents" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:Generator_UserColumnName="contents" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="project" msprop:Generator_ColumnPropNameInTable="projectColumn" msprop:Generator_ColumnPropNameInRow="project" msprop:Generator_UserColumnName="project" msprop:Generator_ColumnVarNameInTable="columnproject" type="xs:int" minOccurs="0" />
<xs:element name="main" msprop:Generator_ColumnPropNameInTable="mainColumn" msprop:Generator_ColumnPropNameInRow="main" msprop:Generator_UserColumnName="main" msprop:Generator_ColumnVarNameInTable="columnmain" minOccurs="0">
<xs:element name="project" msprop:Generator_ColumnVarNameInTable="columnproject" msprop:Generator_ColumnPropNameInRow="project" msprop:Generator_ColumnPropNameInTable="projectColumn" msprop:Generator_UserColumnName="project" type="xs:int" minOccurs="0" />
<xs:element name="main" msprop:Generator_ColumnVarNameInTable="columnmain" msprop:Generator_ColumnPropNameInRow="main" msprop:Generator_ColumnPropNameInTable="mainColumn" msprop:Generator_UserColumnName="main" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="sub" msprop:Generator_ColumnPropNameInTable="subColumn" msprop:Generator_ColumnPropNameInRow="sub" msprop:Generator_UserColumnName="sub" msprop:Generator_ColumnVarNameInTable="columnsub" minOccurs="0">
<xs:element name="sub" msprop:Generator_ColumnVarNameInTable="columnsub" msprop:Generator_ColumnPropNameInRow="sub" msprop:Generator_ColumnPropNameInTable="subColumn" msprop:Generator_UserColumnName="sub" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="memo" msprop:Generator_ColumnPropNameInTable="memoColumn" msprop:Generator_ColumnPropNameInRow="memo" msprop:Generator_UserColumnName="memo" msprop:Generator_ColumnVarNameInTable="columnmemo" minOccurs="0">
<xs:element name="memo" msprop:Generator_ColumnVarNameInTable="columnmemo" msprop:Generator_ColumnPropNameInRow="memo" msprop:Generator_ColumnPropNameInTable="memoColumn" msprop:Generator_UserColumnName="memo" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Board" msprop:Generator_RowEvHandlerName="BoardRowChangeEventHandler" msprop:Generator_RowDeletedName="BoardRowDeleted" msprop:Generator_RowDeletingName="BoardRowDeleting" msprop:Generator_RowEvArgName="BoardRowChangeEvent" msprop:Generator_TablePropName="Board" msprop:Generator_RowChangedName="BoardRowChanged" msprop:Generator_UserTableName="Board" msprop:Generator_RowChangingName="BoardRowChanging" msprop:Generator_RowClassName="BoardRow" msprop:Generator_TableClassName="BoardDataTable" msprop:Generator_TableVarName="tableBoard">
<xs:element name="Holyday" msprop:Generator_UserTableName="Holyday" msprop:Generator_RowEvArgName="HolydayRowChangeEvent" msprop:Generator_TableVarName="tableHolyday" msprop:Generator_TablePropName="Holyday" msprop:Generator_RowDeletingName="HolydayRowDeleting" msprop:Generator_RowChangingName="HolydayRowChanging" msprop:Generator_RowDeletedName="HolydayRowDeleted" msprop:Generator_RowEvHandlerName="HolydayRowChangeEventHandler" msprop:Generator_TableClassName="HolydayDataTable" msprop:Generator_RowChangedName="HolydayRowChanged" msprop:Generator_RowClassName="HolydayRow">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
<xs:element name="bidx" msprop:Generator_ColumnPropNameInTable="bidxColumn" msprop:Generator_ColumnPropNameInRow="bidx" msprop:Generator_UserColumnName="bidx" msprop:Generator_ColumnVarNameInTable="columnbidx" type="xs:int" minOccurs="0" />
<xs:element name="header" msprop:Generator_ColumnPropNameInTable="headerColumn" msprop:Generator_ColumnPropNameInRow="header" msprop:Generator_UserColumnName="header" msprop:Generator_ColumnVarNameInTable="columnheader" type="xs:boolean" minOccurs="0" />
<xs:element name="cate" msprop:Generator_ColumnPropNameInTable="cateColumn" msprop:Generator_ColumnPropNameInRow="cate" msprop:Generator_UserColumnName="cate" msprop:Generator_ColumnVarNameInTable="columncate" minOccurs="0">
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
<xs:element name="cate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="cate" msprop:Generator_ColumnVarNameInTable="columncate" msprop:Generator_ColumnPropNameInTable="cateColumn" msprop:Generator_UserColumnName="cate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2" />
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="title" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_UserColumnName="title" msprop:Generator_ColumnVarNameInTable="columntitle" minOccurs="0">
<xs:element name="result" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="result" msprop:Generator_ColumnVarNameInTable="columnresult" msprop:Generator_ColumnPropNameInTable="resultColumn" msprop:Generator_UserColumnName="result" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="sdate" msprop:Generator_ColumnVarNameInTable="columnsdate" msprop:Generator_ColumnPropNameInRow="sdate" msprop:Generator_ColumnPropNameInTable="sdateColumn" msprop:Generator_UserColumnName="sdate" type="xs:dateTime" minOccurs="0" />
<xs:element name="edate" msprop:Generator_ColumnVarNameInTable="columnedate" msprop:Generator_ColumnPropNameInRow="edate" msprop:Generator_ColumnPropNameInTable="edateColumn" msprop:Generator_UserColumnName="edate" type="xs:dateTime" minOccurs="0" />
<xs:element name="term" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="term" msprop:Generator_ColumnVarNameInTable="columnterm" msprop:Generator_ColumnPropNameInTable="termColumn" msprop:Generator_UserColumnName="term" type="xs:double" minOccurs="0" />
<xs:element name="title" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_ColumnVarNameInTable="columntitle" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:Generator_UserColumnName="title" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="contents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_UserColumnName="contents" msprop:Generator_ColumnVarNameInTable="columncontents" minOccurs="0">
<xs:element name="contents" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_ColumnVarNameInTable="columncontents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:Generator_UserColumnName="contents" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="file" msprop:Generator_ColumnPropNameInTable="fileColumn" msprop:Generator_ColumnPropNameInRow="file" msprop:Generator_UserColumnName="file" msprop:Generator_ColumnVarNameInTable="columnfile" minOccurs="0">
<xs:element name="uid" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_ColumnVarNameInTable="columnuid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_UserColumnName="uid" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="tolist" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="tolist" msprop:Generator_ColumnVarNameInTable="columntolist" msprop:Generator_ColumnPropNameInTable="tolistColumn" msprop:Generator_UserColumnName="tolist" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mail" msprop:nullValue="false" msprop:Generator_ColumnPropNameInRow="mail" msprop:Generator_ColumnVarNameInTable="columnmail" msprop:Generator_ColumnPropNameInTable="mailColumn" msprop:Generator_UserColumnName="mail" type="xs:boolean" minOccurs="0" />
<xs:element name="mailsend" msprop:nullValue="false" msprop:Generator_ColumnPropNameInRow="mailsend" msprop:Generator_ColumnVarNameInTable="columnmailsend" msprop:Generator_ColumnPropNameInTable="mailsendColumn" msprop:Generator_UserColumnName="mailsend" type="xs:boolean" minOccurs="0" />
<xs:element name="reason" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="reason" msprop:Generator_ColumnVarNameInTable="columnreason" msprop:Generator_ColumnPropNameInTable="reasonColumn" msprop:Generator_UserColumnName="reason" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
<xs:element name="termDr" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="termDr" msprop:Generator_ColumnVarNameInTable="columntermDr" msprop:Generator_ColumnPropNameInTable="termDrColumn" msprop:Generator_UserColumnName="termDr" type="xs:double" minOccurs="0" />
<xs:element name="gcode" msprop:Generator_ColumnVarNameInTable="columngcode" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_UserColumnName="gcode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="DrTime" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="DrTime" msprop:Generator_ColumnVarNameInTable="columnDrTime" msprop:Generator_ColumnPropNameInTable="DrTimeColumn" msprop:Generator_UserColumnName="DrTime" type="xs:double" minOccurs="0" />
<xs:element name="CrTime" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="CrTime" msprop:Generator_ColumnVarNameInTable="columnCrTime" msprop:Generator_ColumnPropNameInTable="CrTimeColumn" msprop:Generator_UserColumnName="CrTime" type="xs:double" minOccurs="0" />
<xs:element name="UserName" msdata:ReadOnly="true" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="UserName" msprop:Generator_ColumnVarNameInTable="columnUserName" msprop:Generator_ColumnPropNameInTable="UserNameColumn" msprop:Generator_UserColumnName="UserName" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="200" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="guid" msprop:Generator_ColumnPropNameInTable="guidColumn" msprop:Generator_ColumnPropNameInRow="guid" msprop:Generator_UserColumnName="guid" msprop:Generator_ColumnVarNameInTable="columnguid" minOccurs="0">
<xs:element name="tag" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="tag" msprop:Generator_ColumnVarNameInTable="columntag" msprop:Generator_ColumnPropNameInTable="tagColumn" msprop:Generator_UserColumnName="tag" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
<xs:element name="extcate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="extcate" msprop:Generator_ColumnVarNameInTable="columnextcate" msprop:Generator_ColumnPropNameInTable="extcateColumn" msprop:Generator_UserColumnName="extcate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
<xs:element name="extidx" msprop:nullValue="-1" msprop:Generator_ColumnPropNameInRow="extidx" msprop:Generator_ColumnVarNameInTable="columnextidx" msprop:Generator_ColumnPropNameInTable="extidxColumn" msprop:Generator_UserColumnName="extidx" type="xs:int" minOccurs="0" />
<xs:element name="lock" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="_lock" msprop:Generator_ColumnVarNameInTable="columnlock" msprop:Generator_ColumnPropNameInTable="lockColumn" msprop:Generator_UserColumnName="lock" type="xs:boolean" minOccurs="0" />
<xs:element name="iwol" msprop:Generator_ColumnVarNameInTable="columniwol" msprop:Generator_ColumnPropNameInRow="iwol" msprop:Generator_ColumnPropNameInTable="iwolColumn" msprop:Generator_UserColumnName="iwol" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Holyday" msprop:Generator_RowEvHandlerName="HolydayRowChangeEventHandler" msprop:Generator_RowDeletedName="HolydayRowDeleted" msprop:Generator_RowDeletingName="HolydayRowDeleting" msprop:Generator_RowEvArgName="HolydayRowChangeEvent" msprop:Generator_TablePropName="Holyday" msprop:Generator_RowChangedName="HolydayRowChanged" msprop:Generator_UserTableName="Holyday" msprop:Generator_RowChangingName="HolydayRowChanging" msprop:Generator_RowClassName="HolydayRow" msprop:Generator_TableClassName="HolydayDataTable" msprop:Generator_TableVarName="tableHolyday">
<xs:element name="vHoliday_uselist" msprop:Generator_UserTableName="vHoliday_uselist" msprop:Generator_RowEvArgName="vHoliday_uselistRowChangeEvent" msprop:Generator_TableVarName="tablevHoliday_uselist" msprop:Generator_TablePropName="vHoliday_uselist" msprop:Generator_RowDeletingName="vHoliday_uselistRowDeleting" msprop:Generator_RowChangingName="vHoliday_uselistRowChanging" msprop:Generator_RowDeletedName="vHoliday_uselistRowDeleted" msprop:Generator_RowEvHandlerName="vHoliday_uselistRowChangeEventHandler" msprop:Generator_TableClassName="vHoliday_uselistDataTable" msprop:Generator_RowChangedName="vHoliday_uselistRowChanged" msprop:Generator_RowClassName="vHoliday_uselistRow">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
<xs:element name="cate" msprop:Generator_ColumnPropNameInTable="cateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="cate" msprop:Generator_UserColumnName="cate" msprop:Generator_ColumnVarNameInTable="columncate" minOccurs="0">
<xs:element name="idx" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
<xs:element name="gcode" msprop:Generator_ColumnVarNameInTable="columngcode" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_UserColumnName="gcode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="uid" msprop:Generator_ColumnVarNameInTable="columnuid" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_UserColumnName="uid" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="result" msprop:Generator_ColumnPropNameInTable="resultColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="result" msprop:Generator_UserColumnName="result" msprop:Generator_ColumnVarNameInTable="columnresult" minOccurs="0">
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="sdate" msprop:Generator_ColumnPropNameInTable="sdateColumn" msprop:Generator_ColumnPropNameInRow="sdate" msprop:Generator_UserColumnName="sdate" msprop:Generator_ColumnVarNameInTable="columnsdate" type="xs:dateTime" minOccurs="0" />
<xs:element name="edate" msprop:Generator_ColumnPropNameInTable="edateColumn" msprop:Generator_ColumnPropNameInRow="edate" msprop:Generator_UserColumnName="edate" msprop:Generator_ColumnVarNameInTable="columnedate" type="xs:dateTime" minOccurs="0" />
<xs:element name="term" msprop:Generator_ColumnPropNameInTable="termColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="term" msprop:Generator_UserColumnName="term" msprop:Generator_ColumnVarNameInTable="columnterm" type="xs:double" minOccurs="0" />
<xs:element name="title" msprop:Generator_ColumnPropNameInTable="titleColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="title" msprop:Generator_UserColumnName="title" msprop:Generator_ColumnVarNameInTable="columntitle" minOccurs="0">
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
<xs:element name="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:Generator_UserColumnName="pdate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="termdr" msdata:ReadOnly="true" msprop:Generator_ColumnVarNameInTable="columntermdr" msprop:Generator_ColumnPropNameInRow="termdr" msprop:Generator_ColumnPropNameInTable="termdrColumn" msprop:Generator_UserColumnName="termdr" type="xs:int" minOccurs="0" />
<xs:element name="description" msprop:Generator_ColumnVarNameInTable="columndescription" msprop:Generator_ColumnPropNameInRow="description" msprop:Generator_ColumnPropNameInTable="descriptionColumn" msprop:Generator_UserColumnName="description" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="term" msdata:ReadOnly="true" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="term" msprop:Generator_ColumnVarNameInTable="columnterm" msprop:Generator_ColumnPropNameInTable="termColumn" msprop:Generator_UserColumnName="term" type="xs:int" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="WorkTableGrp" msprop:Generator_UserTableName="WorkTableGrp" msprop:Generator_RowEvArgName="WorkTableGrpRowChangeEvent" msprop:Generator_TableVarName="tableWorkTableGrp" msprop:Generator_TablePropName="WorkTableGrp" msprop:Generator_RowDeletingName="WorkTableGrpRowDeleting" msprop:Generator_RowChangingName="WorkTableGrpRowChanging" msprop:Generator_RowDeletedName="WorkTableGrpRowDeleted" msprop:Generator_RowEvHandlerName="WorkTableGrpRowChangeEventHandler" msprop:Generator_TableClassName="WorkTableGrpDataTable" msprop:Generator_RowChangedName="WorkTableGrpRowChanged" msprop:Generator_RowClassName="WorkTableGrpRow">
<xs:complexType>
<xs:sequence>
<xs:element name="grp" msprop:Generator_ColumnVarNameInTable="columngrp" msprop:Generator_ColumnPropNameInRow="grp" msprop:Generator_ColumnPropNameInTable="grpColumn" msprop:Generator_UserColumnName="grp">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="EETGW_WorkTableUser" msprop:Generator_UserTableName="EETGW_WorkTableUser" msprop:Generator_RowEvArgName="EETGW_WorkTableUserRowChangeEvent" msprop:Generator_TableVarName="tableEETGW_WorkTableUser" msprop:Generator_TablePropName="EETGW_WorkTableUser" msprop:Generator_RowDeletingName="EETGW_WorkTableUserRowDeleting" msprop:Generator_RowChangingName="EETGW_WorkTableUserRowChanging" msprop:Generator_RowDeletedName="EETGW_WorkTableUserRowDeleted" msprop:Generator_RowEvHandlerName="EETGW_WorkTableUserRowChangeEventHandler" msprop:Generator_TableClassName="EETGW_WorkTableUserDataTable" msprop:Generator_RowChangedName="EETGW_WorkTableUserRowChanged" msprop:Generator_RowClassName="EETGW_WorkTableUserRow">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
<xs:element name="gcode" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_ColumnVarNameInTable="columngcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_UserColumnName="gcode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="grp" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grp" msprop:Generator_ColumnVarNameInTable="columngrp" msprop:Generator_ColumnPropNameInTable="grpColumn" msprop:Generator_UserColumnName="grp" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="seq" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="seq" msprop:Generator_ColumnVarNameInTable="columnseq" msprop:Generator_ColumnPropNameInTable="seqColumn" msprop:Generator_UserColumnName="seq" type="xs:int" minOccurs="0" />
<xs:element name="grade" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grade" msprop:Generator_ColumnVarNameInTable="columngrade" msprop:Generator_ColumnPropNameInTable="gradeColumn" msprop:Generator_UserColumnName="grade" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="empno" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="empno" msprop:Generator_ColumnVarNameInTable="columnempno" msprop:Generator_ColumnPropNameInTable="empnoColumn" msprop:Generator_UserColumnName="empno" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="name" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="name" msprop:Generator_ColumnVarNameInTable="columnname" msprop:Generator_ColumnPropNameInTable="nameColumn" msprop:Generator_UserColumnName="name" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
<xs:element name="indate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="indate" msprop:Generator_ColumnVarNameInTable="columnindate" msprop:Generator_ColumnPropNameInTable="indateColumn" msprop:Generator_UserColumnName="indate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="email" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="email" msprop:Generator_ColumnVarNameInTable="columnemail" msprop:Generator_ColumnPropNameInTable="emailColumn" msprop:Generator_UserColumnName="email" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="vJobReportForUser" msprop:Generator_UserTableName="vJobReportForUser" msprop:Generator_RowEvArgName="vJobReportForUserRowChangeEvent" msprop:Generator_TableVarName="tablevJobReportForUser" msprop:Generator_TablePropName="vJobReportForUser" msprop:Generator_RowDeletingName="vJobReportForUserRowDeleting" msprop:Generator_RowChangingName="vJobReportForUserRowChanging" msprop:Generator_RowDeletedName="vJobReportForUserRowDeleted" msprop:Generator_RowEvHandlerName="vJobReportForUserRowChangeEventHandler" msprop:Generator_TableClassName="vJobReportForUserDataTable" msprop:Generator_RowChangedName="vJobReportForUserRowChanged" msprop:Generator_RowClassName="vJobReportForUserRow">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
<xs:element name="pdate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:Generator_UserColumnName="pdate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="gcode" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_ColumnVarNameInTable="columngcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_UserColumnName="gcode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="id" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="id" msprop:Generator_ColumnVarNameInTable="columnid" msprop:Generator_ColumnPropNameInTable="idColumn" msprop:Generator_UserColumnName="id" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="name" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="name" msprop:Generator_ColumnVarNameInTable="columnname" msprop:Generator_ColumnPropNameInTable="nameColumn" msprop:Generator_UserColumnName="name" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="process" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="process" msprop:Generator_ColumnVarNameInTable="columnprocess" msprop:Generator_ColumnPropNameInTable="processColumn" msprop:Generator_UserColumnName="process" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="type" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="type" msprop:Generator_ColumnVarNameInTable="columntype" msprop:Generator_ColumnPropNameInTable="typeColumn" msprop:Generator_UserColumnName="type" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="svalue" msdata:ReadOnly="true" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="svalue" msprop:Generator_ColumnVarNameInTable="columnsvalue" msprop:Generator_ColumnPropNameInTable="svalueColumn" msprop:Generator_UserColumnName="svalue" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="contents" msprop:Generator_ColumnPropNameInTable="contentsColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="contents" msprop:Generator_UserColumnName="contents" msprop:Generator_ColumnVarNameInTable="columncontents" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_UserColumnName="uid" msprop:Generator_ColumnVarNameInTable="columnuid" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="tolist" msprop:Generator_ColumnPropNameInTable="tolistColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="tolist" msprop:Generator_UserColumnName="tolist" msprop:Generator_ColumnVarNameInTable="columntolist" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="mail" msprop:Generator_ColumnPropNameInTable="mailColumn" msprop:nullValue="false" msprop:Generator_ColumnPropNameInRow="mail" msprop:Generator_UserColumnName="mail" msprop:Generator_ColumnVarNameInTable="columnmail" type="xs:boolean" minOccurs="0" />
<xs:element name="mailsend" msprop:Generator_ColumnPropNameInTable="mailsendColumn" msprop:nullValue="false" msprop:Generator_ColumnPropNameInRow="mailsend" msprop:Generator_UserColumnName="mailsend" msprop:Generator_ColumnVarNameInTable="columnmailsend" type="xs:boolean" minOccurs="0" />
<xs:element name="reason" msprop:Generator_ColumnPropNameInTable="reasonColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="reason" msprop:Generator_UserColumnName="reason" msprop:Generator_ColumnVarNameInTable="columnreason" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
<xs:element name="termDr" msprop:Generator_ColumnPropNameInTable="termDrColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="termDr" msprop:Generator_UserColumnName="termDr" msprop:Generator_ColumnVarNameInTable="columntermDr" type="xs:double" minOccurs="0" />
<xs:element name="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_UserColumnName="gcode" msprop:Generator_ColumnVarNameInTable="columngcode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="DrTime" msprop:Generator_ColumnPropNameInTable="DrTimeColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="DrTime" msprop:Generator_UserColumnName="DrTime" msprop:Generator_ColumnVarNameInTable="columnDrTime" type="xs:double" minOccurs="0" />
<xs:element name="CrTime" msprop:Generator_ColumnPropNameInTable="CrTimeColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="CrTime" msprop:Generator_UserColumnName="CrTime" msprop:Generator_ColumnVarNameInTable="columnCrTime" type="xs:double" minOccurs="0" />
<xs:element name="UserName" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="UserNameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="UserName" msprop:Generator_UserColumnName="UserName" msprop:Generator_ColumnVarNameInTable="columnUserName" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="200" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="tag" msprop:Generator_ColumnPropNameInTable="tagColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="tag" msprop:Generator_UserColumnName="tag" msprop:Generator_ColumnVarNameInTable="columntag" minOccurs="0">
<xs:element name="hrs" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="hrs" msprop:Generator_ColumnVarNameInTable="columnhrs" msprop:Generator_ColumnPropNameInTable="hrsColumn" msprop:Generator_UserColumnName="hrs" type="xs:double" minOccurs="0" />
<xs:element name="ot" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="ot" msprop:Generator_ColumnVarNameInTable="columnot" msprop:Generator_ColumnPropNameInTable="otColumn" msprop:Generator_UserColumnName="ot" type="xs:double" minOccurs="0" />
<xs:element name="requestpart" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="requestpart" msprop:Generator_ColumnVarNameInTable="columnrequestpart" msprop:Generator_ColumnPropNameInTable="requestpartColumn" msprop:Generator_UserColumnName="requestpart" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="extcate" msprop:Generator_ColumnPropNameInTable="extcateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="extcate" msprop:Generator_UserColumnName="extcate" msprop:Generator_ColumnVarNameInTable="columnextcate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="extidx" msprop:Generator_ColumnPropNameInTable="extidxColumn" msprop:nullValue="-1" msprop:Generator_ColumnPropNameInRow="extidx" msprop:Generator_UserColumnName="extidx" msprop:Generator_ColumnVarNameInTable="columnextidx" type="xs:int" minOccurs="0" />
<xs:element name="lock" msprop:Generator_ColumnPropNameInTable="lockColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="_lock" msprop:Generator_UserColumnName="lock" msprop:Generator_ColumnVarNameInTable="columnlock" type="xs:boolean" minOccurs="0" />
<xs:element name="iwol" msprop:Generator_UserColumnName="iwol" msprop:Generator_ColumnPropNameInTable="iwolColumn" msprop:Generator_ColumnPropNameInRow="iwol" msprop:Generator_ColumnVarNameInTable="columniwol" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="vHoliday_uselist" msprop:Generator_RowEvHandlerName="vHoliday_uselistRowChangeEventHandler" msprop:Generator_RowDeletedName="vHoliday_uselistRowDeleted" msprop:Generator_RowDeletingName="vHoliday_uselistRowDeleting" msprop:Generator_RowEvArgName="vHoliday_uselistRowChangeEvent" msprop:Generator_TablePropName="vHoliday_uselist" msprop:Generator_RowChangedName="vHoliday_uselistRowChanged" msprop:Generator_UserTableName="vHoliday_uselist" msprop:Generator_RowChangingName="vHoliday_uselistRowChanging" msprop:Generator_RowClassName="vHoliday_uselistRow" msprop:Generator_TableClassName="vHoliday_uselistDataTable" msprop:Generator_TableVarName="tablevHoliday_uselist">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
<xs:element name="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_UserColumnName="gcode" msprop:Generator_ColumnVarNameInTable="columngcode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_UserColumnName="uid" msprop:Generator_ColumnVarNameInTable="columnuid" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
<xs:element name="pdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_UserColumnName="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="termdr" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="termdrColumn" msprop:Generator_ColumnPropNameInRow="termdr" msprop:Generator_UserColumnName="termdr" msprop:Generator_ColumnVarNameInTable="columntermdr" type="xs:int" minOccurs="0" />
<xs:element name="description" msprop:Generator_ColumnPropNameInTable="descriptionColumn" msprop:Generator_ColumnPropNameInRow="description" msprop:Generator_UserColumnName="description" msprop:Generator_ColumnVarNameInTable="columndescription" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="term" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="termColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="term" msprop:Generator_UserColumnName="term" msprop:Generator_ColumnVarNameInTable="columnterm" type="xs:int" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="WorkTableGrp" msprop:Generator_RowEvHandlerName="WorkTableGrpRowChangeEventHandler" msprop:Generator_RowDeletedName="WorkTableGrpRowDeleted" msprop:Generator_RowDeletingName="WorkTableGrpRowDeleting" msprop:Generator_RowEvArgName="WorkTableGrpRowChangeEvent" msprop:Generator_TablePropName="WorkTableGrp" msprop:Generator_RowChangedName="WorkTableGrpRowChanged" msprop:Generator_UserTableName="WorkTableGrp" msprop:Generator_RowChangingName="WorkTableGrpRowChanging" msprop:Generator_RowClassName="WorkTableGrpRow" msprop:Generator_TableClassName="WorkTableGrpDataTable" msprop:Generator_TableVarName="tableWorkTableGrp">
<xs:complexType>
<xs:sequence>
<xs:element name="grp" msprop:Generator_ColumnPropNameInTable="grpColumn" msprop:Generator_ColumnPropNameInRow="grp" msprop:Generator_UserColumnName="grp" msprop:Generator_ColumnVarNameInTable="columngrp">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="EETGW_WorkTableUser" msprop:Generator_RowEvHandlerName="EETGW_WorkTableUserRowChangeEventHandler" msprop:Generator_RowDeletedName="EETGW_WorkTableUserRowDeleted" msprop:Generator_RowDeletingName="EETGW_WorkTableUserRowDeleting" msprop:Generator_RowEvArgName="EETGW_WorkTableUserRowChangeEvent" msprop:Generator_TablePropName="EETGW_WorkTableUser" msprop:Generator_RowChangedName="EETGW_WorkTableUserRowChanged" msprop:Generator_UserTableName="EETGW_WorkTableUser" msprop:Generator_RowChangingName="EETGW_WorkTableUserRowChanging" msprop:Generator_RowClassName="EETGW_WorkTableUserRow" msprop:Generator_TableClassName="EETGW_WorkTableUserDataTable" msprop:Generator_TableVarName="tableEETGW_WorkTableUser">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
<xs:element name="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_UserColumnName="gcode" msprop:Generator_ColumnVarNameInTable="columngcode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="grp" msprop:Generator_ColumnPropNameInTable="grpColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grp" msprop:Generator_UserColumnName="grp" msprop:Generator_ColumnVarNameInTable="columngrp" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="seq" msprop:Generator_ColumnPropNameInTable="seqColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="seq" msprop:Generator_UserColumnName="seq" msprop:Generator_ColumnVarNameInTable="columnseq" type="xs:int" minOccurs="0" />
<xs:element name="grade" msprop:Generator_ColumnPropNameInTable="gradeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grade" msprop:Generator_UserColumnName="grade" msprop:Generator_ColumnVarNameInTable="columngrade" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="empno" msprop:Generator_ColumnPropNameInTable="empnoColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="empno" msprop:Generator_UserColumnName="empno" msprop:Generator_ColumnVarNameInTable="columnempno" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="name" msprop:Generator_ColumnPropNameInTable="nameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="name" msprop:Generator_UserColumnName="name" msprop:Generator_ColumnVarNameInTable="columnname" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
<xs:element name="indate" msprop:Generator_ColumnPropNameInTable="indateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="indate" msprop:Generator_UserColumnName="indate" msprop:Generator_ColumnVarNameInTable="columnindate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="email" msprop:Generator_ColumnPropNameInTable="emailColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="email" msprop:Generator_UserColumnName="email" msprop:Generator_ColumnVarNameInTable="columnemail" minOccurs="0">
<xs:element name="package" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="package" msprop:Generator_ColumnVarNameInTable="columnpackage" msprop:Generator_ColumnPropNameInTable="packageColumn" msprop:Generator_UserColumnName="package" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="vJobReportForUser" msprop:Generator_RowEvHandlerName="vJobReportForUserRowChangeEventHandler" msprop:Generator_RowDeletedName="vJobReportForUserRowDeleted" msprop:Generator_RowDeletingName="vJobReportForUserRowDeleting" msprop:Generator_RowEvArgName="vJobReportForUserRowChangeEvent" msprop:Generator_TablePropName="vJobReportForUser" msprop:Generator_RowChangedName="vJobReportForUserRowChanged" msprop:Generator_UserTableName="vJobReportForUser" msprop:Generator_RowChangingName="vJobReportForUserRowChanging" msprop:Generator_RowClassName="vJobReportForUserRow" msprop:Generator_TableClassName="vJobReportForUserDataTable" msprop:Generator_TableVarName="tablevJobReportForUser">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
<xs:element name="pdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_UserColumnName="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" minOccurs="0">
<xs:element name="userProcess" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="userProcess" msprop:Generator_ColumnVarNameInTable="columnuserProcess" msprop:Generator_ColumnPropNameInTable="userProcessColumn" msprop:Generator_UserColumnName="userProcess" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="gcode" msprop:Generator_ColumnPropNameInTable="gcodeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="gcode" msprop:Generator_UserColumnName="gcode" msprop:Generator_ColumnVarNameInTable="columngcode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="id" msprop:Generator_ColumnPropNameInTable="idColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="id" msprop:Generator_UserColumnName="id" msprop:Generator_ColumnVarNameInTable="columnid" minOccurs="0">
<xs:element name="status" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="status" msprop:Generator_ColumnVarNameInTable="columnstatus" msprop:Generator_ColumnPropNameInTable="statusColumn" msprop:Generator_UserColumnName="status" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="name" msprop:Generator_ColumnPropNameInTable="nameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="name" msprop:Generator_UserColumnName="name" msprop:Generator_ColumnVarNameInTable="columnname" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="process" msprop:Generator_ColumnPropNameInTable="processColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="process" msprop:Generator_UserColumnName="process" msprop:Generator_ColumnVarNameInTable="columnprocess" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="type" msprop:Generator_ColumnPropNameInTable="typeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="type" msprop:Generator_UserColumnName="type" msprop:Generator_ColumnVarNameInTable="columntype" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="svalue" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="svalueColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="svalue" msprop:Generator_UserColumnName="svalue" msprop:Generator_ColumnVarNameInTable="columnsvalue" minOccurs="0">
<xs:element name="projectName" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="projectName" msprop:Generator_ColumnVarNameInTable="columnprojectName" msprop:Generator_ColumnPropNameInTable="projectNameColumn" msprop:Generator_UserColumnName="projectName" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="hrs" msprop:Generator_ColumnPropNameInTable="hrsColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="hrs" msprop:Generator_UserColumnName="hrs" msprop:Generator_ColumnVarNameInTable="columnhrs" type="xs:double" minOccurs="0" />
<xs:element name="ot" msprop:Generator_ColumnPropNameInTable="otColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="ot" msprop:Generator_UserColumnName="ot" msprop:Generator_ColumnVarNameInTable="columnot" type="xs:double" minOccurs="0" />
<xs:element name="requestpart" msprop:Generator_ColumnPropNameInTable="requestpartColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="requestpart" msprop:Generator_UserColumnName="requestpart" msprop:Generator_ColumnVarNameInTable="columnrequestpart" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="package" msprop:Generator_ColumnPropNameInTable="packageColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="package" msprop:Generator_UserColumnName="package" msprop:Generator_ColumnVarNameInTable="columnpackage" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="userProcess" msprop:Generator_ColumnPropNameInTable="userProcessColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="userProcess" msprop:Generator_UserColumnName="userProcess" msprop:Generator_ColumnVarNameInTable="columnuserProcess" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="50" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="status" msprop:Generator_ColumnPropNameInTable="statusColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="status" msprop:Generator_UserColumnName="status" msprop:Generator_ColumnVarNameInTable="columnstatus" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="projectName" msprop:Generator_ColumnPropNameInTable="projectNameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="projectName" msprop:Generator_UserColumnName="projectName" msprop:Generator_ColumnVarNameInTable="columnprojectName" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="description" msprop:Generator_ColumnPropNameInTable="descriptionColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="description" msprop:Generator_UserColumnName="description" msprop:Generator_ColumnVarNameInTable="columndescription" minOccurs="0">
<xs:element name="description" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="description" msprop:Generator_ColumnVarNameInTable="columndescription" msprop:Generator_ColumnPropNameInTable="descriptionColumn" msprop:Generator_UserColumnName="description" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="2147483647" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="ww" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="wwColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="ww" msprop:Generator_UserColumnName="ww" msprop:Generator_ColumnVarNameInTable="columnww" minOccurs="0">
<xs:element name="ww" msdata:ReadOnly="true" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="ww" msprop:Generator_ColumnVarNameInTable="columnww" msprop:Generator_ColumnPropNameInTable="wwColumn" msprop:Generator_UserColumnName="ww" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="6" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="otStart" msprop:Generator_ColumnPropNameInTable="otStartColumn" msprop:Generator_ColumnPropNameInRow="otStart" msprop:Generator_UserColumnName="otStart" msprop:Generator_ColumnVarNameInTable="columnotStart" type="xs:dateTime" minOccurs="0" />
<xs:element name="otEnd" msprop:Generator_ColumnPropNameInTable="otEndColumn" msprop:Generator_ColumnPropNameInRow="otEnd" msprop:Generator_UserColumnName="otEnd" msprop:Generator_ColumnVarNameInTable="columnotEnd" type="xs:dateTime" minOccurs="0" />
<xs:element name="ot2" msprop:Generator_ColumnPropNameInTable="ot2Column" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="ot2" msprop:Generator_UserColumnName="ot2" msprop:Generator_ColumnVarNameInTable="columnot2" type="xs:double" minOccurs="0" />
<xs:element name="otReason" msprop:Generator_ColumnPropNameInTable="otReasonColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="otReason" msprop:Generator_UserColumnName="otReason" msprop:Generator_ColumnVarNameInTable="columnotReason" minOccurs="0">
<xs:element name="otStart" msprop:Generator_ColumnVarNameInTable="columnotStart" msprop:Generator_ColumnPropNameInRow="otStart" msprop:Generator_ColumnPropNameInTable="otStartColumn" msprop:Generator_UserColumnName="otStart" type="xs:dateTime" minOccurs="0" />
<xs:element name="otEnd" msprop:Generator_ColumnVarNameInTable="columnotEnd" msprop:Generator_ColumnPropNameInRow="otEnd" msprop:Generator_ColumnPropNameInTable="otEndColumn" msprop:Generator_UserColumnName="otEnd" type="xs:dateTime" minOccurs="0" />
<xs:element name="ot2" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="ot2" msprop:Generator_ColumnVarNameInTable="columnot2" msprop:Generator_ColumnPropNameInTable="ot2Column" msprop:Generator_UserColumnName="ot2" type="xs:double" minOccurs="0" />
<xs:element name="otReason" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="otReason" msprop:Generator_ColumnVarNameInTable="columnotReason" msprop:Generator_ColumnPropNameInTable="otReasonColumn" msprop:Generator_UserColumnName="otReason" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="grade" msprop:Generator_ColumnPropNameInTable="gradeColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grade" msprop:Generator_UserColumnName="grade" msprop:Generator_ColumnVarNameInTable="columngrade" minOccurs="0">
<xs:element name="grade" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="grade" msprop:Generator_ColumnVarNameInTable="columngrade" msprop:Generator_ColumnPropNameInTable="gradeColumn" msprop:Generator_UserColumnName="grade" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="indate" msprop:Generator_ColumnPropNameInTable="indateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="indate" msprop:Generator_UserColumnName="indate" msprop:Generator_ColumnVarNameInTable="columnindate" minOccurs="0">
<xs:element name="indate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="indate" msprop:Generator_ColumnVarNameInTable="columnindate" msprop:Generator_ColumnPropNameInTable="indateColumn" msprop:Generator_UserColumnName="indate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="outdate" msprop:Generator_ColumnPropNameInTable="outdateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="outdate" msprop:Generator_UserColumnName="outdate" msprop:Generator_ColumnVarNameInTable="columnoutdate" minOccurs="0">
<xs:element name="outdate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="outdate" msprop:Generator_ColumnVarNameInTable="columnoutdate" msprop:Generator_ColumnPropNameInTable="outdateColumn" msprop:Generator_UserColumnName="outdate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="otPMS" msprop:Generator_ColumnPropNameInTable="otPMSColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="otPMS" msprop:Generator_UserColumnName="otPMS" msprop:Generator_ColumnVarNameInTable="columnotPMS" type="xs:double" minOccurs="0" />
<xs:element name="otPMS" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="otPMS" msprop:Generator_ColumnVarNameInTable="columnotPMS" msprop:Generator_ColumnPropNameInTable="otPMSColumn" msprop:Generator_UserColumnName="otPMS" type="xs:double" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="HolidayLIst" msprop:Generator_RowEvHandlerName="HolidayLIstRowChangeEventHandler" msprop:Generator_RowDeletedName="HolidayLIstRowDeleted" msprop:Generator_RowDeletingName="HolidayLIstRowDeleting" msprop:Generator_RowEvArgName="HolidayLIstRowChangeEvent" msprop:Generator_TablePropName="HolidayLIst" msprop:Generator_RowChangedName="HolidayLIstRowChanged" msprop:Generator_UserTableName="HolidayLIst" msprop:Generator_RowChangingName="HolidayLIstRowChanging" msprop:Generator_RowClassName="HolidayLIstRow" msprop:Generator_TableClassName="HolidayLIstDataTable" msprop:Generator_TableVarName="tableHolidayLIst">
<xs:element name="HolidayLIst" msprop:Generator_UserTableName="HolidayLIst" msprop:Generator_RowEvArgName="HolidayLIstRowChangeEvent" msprop:Generator_TableVarName="tableHolidayLIst" msprop:Generator_TablePropName="HolidayLIst" msprop:Generator_RowDeletingName="HolidayLIstRowDeleting" msprop:Generator_RowChangingName="HolidayLIstRowChanging" msprop:Generator_RowDeletedName="HolidayLIstRowDeleted" msprop:Generator_RowEvHandlerName="HolidayLIstRowChangeEventHandler" msprop:Generator_TableClassName="HolidayLIstDataTable" msprop:Generator_RowChangedName="HolidayLIstRowChanged" msprop:Generator_RowClassName="HolidayLIstRow">
<xs:complexType>
<xs:sequence>
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_UserColumnName="idx" msprop:Generator_ColumnVarNameInTable="columnidx" type="xs:int" />
<xs:element name="pdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_UserColumnName="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" minOccurs="0">
<xs:element name="idx" msdata:ReadOnly="true" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="-1" msdata:AutoIncrementStep="-1" msprop:Generator_ColumnVarNameInTable="columnidx" msprop:Generator_ColumnPropNameInRow="idx" msprop:Generator_ColumnPropNameInTable="idxColumn" msprop:Generator_UserColumnName="idx" type="xs:int" />
<xs:element name="pdate" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="pdate" msprop:Generator_ColumnVarNameInTable="columnpdate" msprop:Generator_ColumnPropNameInTable="pdateColumn" msprop:Generator_UserColumnName="pdate" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="free" msprop:Generator_ColumnPropNameInTable="freeColumn" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="free" msprop:Generator_UserColumnName="free" msprop:Generator_ColumnVarNameInTable="columnfree" type="xs:boolean" minOccurs="0" />
<xs:element name="memo" msprop:Generator_ColumnPropNameInTable="memoColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="memo" msprop:Generator_UserColumnName="memo" msprop:Generator_ColumnVarNameInTable="columnmemo" minOccurs="0">
<xs:element name="free" msprop:nullValue="0" msprop:Generator_ColumnPropNameInRow="free" msprop:Generator_ColumnVarNameInTable="columnfree" msprop:Generator_ColumnPropNameInTable="freeColumn" msprop:Generator_UserColumnName="free" type="xs:boolean" minOccurs="0" />
<xs:element name="memo" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="memo" msprop:Generator_ColumnVarNameInTable="columnmemo" msprop:Generator_ColumnPropNameInTable="memoColumn" msprop:Generator_UserColumnName="memo" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_UserColumnName="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid">
<xs:element name="wuid" msprop:Generator_ColumnVarNameInTable="columnwuid" msprop:Generator_ColumnPropNameInRow="wuid" msprop:Generator_ColumnPropNameInTable="wuidColumn" msprop:Generator_UserColumnName="wuid">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_UserColumnName="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" type="xs:dateTime" />
<xs:element name="wdate" msprop:Generator_ColumnVarNameInTable="columnwdate" msprop:Generator_ColumnPropNameInRow="wdate" msprop:Generator_ColumnPropNameInTable="wdateColumn" msprop:Generator_UserColumnName="wdate" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="HolydayUserList" msprop:Generator_RowEvHandlerName="HolydayUserListRowChangeEventHandler" msprop:Generator_RowDeletedName="HolydayUserListRowDeleted" msprop:Generator_RowDeletingName="HolydayUserListRowDeleting" msprop:Generator_RowEvArgName="HolydayUserListRowChangeEvent" msprop:Generator_TablePropName="HolydayUserList" msprop:Generator_RowChangedName="HolydayUserListRowChanged" msprop:Generator_UserTableName="HolydayUserList" msprop:Generator_RowChangingName="HolydayUserListRowChanging" msprop:Generator_RowClassName="HolydayUserListRow" msprop:Generator_TableClassName="HolydayUserListDataTable" msprop:Generator_TableVarName="tableHolydayUserList">
<xs:element name="HolydayUserList" msprop:Generator_UserTableName="HolydayUserList" msprop:Generator_RowEvArgName="HolydayUserListRowChangeEvent" msprop:Generator_TableVarName="tableHolydayUserList" msprop:Generator_TablePropName="HolydayUserList" msprop:Generator_RowDeletingName="HolydayUserListRowDeleting" msprop:Generator_RowChangingName="HolydayUserListRowChanging" msprop:Generator_RowDeletedName="HolydayUserListRowDeleted" msprop:Generator_RowEvHandlerName="HolydayUserListRowChangeEventHandler" msprop:Generator_TableClassName="HolydayUserListDataTable" msprop:Generator_RowChangedName="HolydayUserListRowChanged" msprop:Generator_RowClassName="HolydayUserListRow">
<xs:complexType>
<xs:sequence>
<xs:element name="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_UserColumnName="uid" msprop:Generator_ColumnVarNameInTable="columnuid">
<xs:element name="uid" msprop:Generator_ColumnVarNameInTable="columnuid" msprop:Generator_ColumnPropNameInRow="uid" msprop:Generator_ColumnPropNameInTable="uidColumn" msprop:Generator_UserColumnName="uid">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="UserName" msdata:ReadOnly="true" msprop:Generator_ColumnPropNameInTable="UserNameColumn" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="UserName" msprop:Generator_UserColumnName="UserName" msprop:Generator_ColumnVarNameInTable="columnUserName" minOccurs="0">
<xs:element name="UserName" msdata:ReadOnly="true" msprop:nullValue="_empty" msprop:Generator_ColumnPropNameInRow="UserName" msprop:Generator_ColumnVarNameInTable="columnUserName" msprop:Generator_ColumnPropNameInTable="UserNameColumn" msprop:Generator_UserColumnName="UserName" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="200" />
@@ -1444,10 +1291,6 @@ WHERE (gcode = @gcode) AND (uid = @uid) AND (CONVERT(CHAR(10), sdate, 23) &gt;=
<xs:selector xpath=".//mstns:minutes" />
<xs:field xpath="mstns:idx" />
</xs:unique>
<xs:unique name="Board_Constraint1" msdata:ConstraintName="Constraint1" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:Board" />
<xs:field xpath="mstns:idx" />
</xs:unique>
<xs:unique name="Holyday_Constraint1" msdata:ConstraintName="Constraint1" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:Holyday" />
<xs:field xpath="mstns:idx" />

View File

@@ -4,10 +4,9 @@
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
</autogenerated>-->
<DiagramLayout xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ex:showrelationlabel="False" ViewPortX="114" ViewPortY="-10" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="-10" ViewPortY="-10" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
<Shapes>
<Shape ID="DesignTable:minutes" ZOrder="10" X="70" Y="70" Height="324" Width="192" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Board" ZOrder="9" X="332" Y="70" Height="267" Width="179" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
<Shape ID="DesignTable:minutes" ZOrder="9" X="70" Y="70" Height="324" Width="192" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Holyday" ZOrder="4" X="581" Y="70" Height="537" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="410" />
<Shape ID="DesignTable:vHoliday_uselist" ZOrder="3" X="916" Y="68" Height="248" Width="250" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="178" />
<Shape ID="DesignTable:WorkTableGrp" ZOrder="8" X="257" Y="433" Height="133" Width="289" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="83" />

View File

@@ -302,7 +302,6 @@
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.Connection = null;
this.tam.HolydayTableAdapter = null;
this.tam.minutesTableAdapter = null;

File diff suppressed because one or more lines are too long

View File

@@ -1,415 +0,0 @@
namespace FCM0000
{
partial class fPatchList
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fPatchList));
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
this.bn = new System.Windows.Forms.BindingNavigator(this.components);
this.bindingNavigatorCountItem = new System.Windows.Forms.ToolStripLabel();
this.bindingNavigatorDeleteItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMoveFirstItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMovePreviousItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorSeparator = new System.Windows.Forms.ToolStripSeparator();
this.bindingNavigatorPositionItem = new System.Windows.Forms.ToolStripTextBox();
this.bindingNavigatorSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.bindingNavigatorMoveNextItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMoveLastItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.bindingNavigatorAddNewItem = new System.Windows.Forms.ToolStripButton();
this.BTsAVE = new System.Windows.Forms.ToolStripButton();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.btSearch = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripButton2 = new System.Windows.Forms.ToolStripButton();
this.dv1 = new arCtl.arDatagridView();
this.bs = new System.Windows.Forms.BindingSource(this.components);
this.dsMSSQL = new FCM0000.dsMSSQL();
this.tam = new FCM0000.dsMSSQLTableAdapters.TableAdapterManager();
this.ta = new FCM0000.dsMSSQLTableAdapters.BoardTableAdapter();
this.wdateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.cateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.titleDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.close = new System.Windows.Forms.DataGridViewCheckBoxColumn();
this.wuid_name = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.urlDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)(this.bn)).BeginInit();
this.bn.SuspendLayout();
this.toolStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dv1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).BeginInit();
this.SuspendLayout();
//
// bn
//
this.bn.AddNewItem = null;
this.bn.BindingSource = this.bs;
this.bn.CountItem = this.bindingNavigatorCountItem;
this.bn.DeleteItem = this.bindingNavigatorDeleteItem;
this.bn.Dock = System.Windows.Forms.DockStyle.Bottom;
this.bn.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.bindingNavigatorMoveFirstItem,
this.bindingNavigatorMovePreviousItem,
this.bindingNavigatorSeparator,
this.bindingNavigatorPositionItem,
this.bindingNavigatorCountItem,
this.bindingNavigatorSeparator1,
this.bindingNavigatorMoveNextItem,
this.bindingNavigatorMoveLastItem,
this.bindingNavigatorSeparator2,
this.bindingNavigatorAddNewItem,
this.bindingNavigatorDeleteItem,
this.BTsAVE});
this.bn.Location = new System.Drawing.Point(0, 559);
this.bn.MoveFirstItem = this.bindingNavigatorMoveFirstItem;
this.bn.MoveLastItem = this.bindingNavigatorMoveLastItem;
this.bn.MoveNextItem = this.bindingNavigatorMoveNextItem;
this.bn.MovePreviousItem = this.bindingNavigatorMovePreviousItem;
this.bn.Name = "bn";
this.bn.PositionItem = this.bindingNavigatorPositionItem;
this.bn.Size = new System.Drawing.Size(909, 25);
this.bn.TabIndex = 0;
this.bn.Text = "bindingNavigator1";
//
// bindingNavigatorCountItem
//
this.bindingNavigatorCountItem.Name = "bindingNavigatorCountItem";
this.bindingNavigatorCountItem.Size = new System.Drawing.Size(27, 22);
this.bindingNavigatorCountItem.Text = "/{0}";
this.bindingNavigatorCountItem.ToolTipText = "전체 항목 수";
//
// bindingNavigatorDeleteItem
//
this.bindingNavigatorDeleteItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorDeleteItem.Image")));
this.bindingNavigatorDeleteItem.Name = "bindingNavigatorDeleteItem";
this.bindingNavigatorDeleteItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorDeleteItem.Size = new System.Drawing.Size(78, 22);
this.bindingNavigatorDeleteItem.Text = "Delete(&D)";
//
// bindingNavigatorMoveFirstItem
//
this.bindingNavigatorMoveFirstItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMoveFirstItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveFirstItem.Image")));
this.bindingNavigatorMoveFirstItem.Name = "bindingNavigatorMoveFirstItem";
this.bindingNavigatorMoveFirstItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMoveFirstItem.Size = new System.Drawing.Size(23, 22);
this.bindingNavigatorMoveFirstItem.Text = "처음으로 이동";
//
// bindingNavigatorMovePreviousItem
//
this.bindingNavigatorMovePreviousItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMovePreviousItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMovePreviousItem.Image")));
this.bindingNavigatorMovePreviousItem.Name = "bindingNavigatorMovePreviousItem";
this.bindingNavigatorMovePreviousItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMovePreviousItem.Size = new System.Drawing.Size(23, 22);
this.bindingNavigatorMovePreviousItem.Text = "이전으로 이동";
//
// bindingNavigatorSeparator
//
this.bindingNavigatorSeparator.Name = "bindingNavigatorSeparator";
this.bindingNavigatorSeparator.Size = new System.Drawing.Size(6, 25);
//
// bindingNavigatorPositionItem
//
this.bindingNavigatorPositionItem.AccessibleName = "위치";
this.bindingNavigatorPositionItem.AutoSize = false;
this.bindingNavigatorPositionItem.Name = "bindingNavigatorPositionItem";
this.bindingNavigatorPositionItem.Size = new System.Drawing.Size(50, 23);
this.bindingNavigatorPositionItem.Text = "0";
this.bindingNavigatorPositionItem.ToolTipText = "현재 위치";
//
// bindingNavigatorSeparator1
//
this.bindingNavigatorSeparator1.Name = "bindingNavigatorSeparator1";
this.bindingNavigatorSeparator1.Size = new System.Drawing.Size(6, 25);
//
// bindingNavigatorMoveNextItem
//
this.bindingNavigatorMoveNextItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMoveNextItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveNextItem.Image")));
this.bindingNavigatorMoveNextItem.Name = "bindingNavigatorMoveNextItem";
this.bindingNavigatorMoveNextItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMoveNextItem.Size = new System.Drawing.Size(23, 22);
this.bindingNavigatorMoveNextItem.Text = "다음으로 이동";
//
// bindingNavigatorMoveLastItem
//
this.bindingNavigatorMoveLastItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMoveLastItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveLastItem.Image")));
this.bindingNavigatorMoveLastItem.Name = "bindingNavigatorMoveLastItem";
this.bindingNavigatorMoveLastItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMoveLastItem.Size = new System.Drawing.Size(23, 22);
this.bindingNavigatorMoveLastItem.Text = "마지막으로 이동";
//
// bindingNavigatorSeparator2
//
this.bindingNavigatorSeparator2.Name = "bindingNavigatorSeparator2";
this.bindingNavigatorSeparator2.Size = new System.Drawing.Size(6, 25);
//
// bindingNavigatorAddNewItem
//
this.bindingNavigatorAddNewItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorAddNewItem.Image")));
this.bindingNavigatorAddNewItem.Name = "bindingNavigatorAddNewItem";
this.bindingNavigatorAddNewItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorAddNewItem.Size = new System.Drawing.Size(65, 22);
this.bindingNavigatorAddNewItem.Text = "Add(&A)";
this.bindingNavigatorAddNewItem.Click += new System.EventHandler(this.bindingNavigatorAddNewItem_Click);
//
// BTsAVE
//
this.BTsAVE.Image = ((System.Drawing.Image)(resources.GetObject("BTsAVE.Image")));
this.BTsAVE.Name = "BTsAVE";
this.BTsAVE.Size = new System.Drawing.Size(67, 22);
this.BTsAVE.Text = "Save(&S)";
this.BTsAVE.Click += new System.EventHandler(this.boardBindingNavigatorSaveItem_Click);
//
// richTextBox1
//
this.richTextBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "contents", true));
this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.richTextBox1.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.richTextBox1.Location = new System.Drawing.Point(0, 295);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(909, 264);
this.richTextBox1.TabIndex = 3;
this.richTextBox1.Text = "";
//
// toolStrip1
//
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(30, 30);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.btSearch,
this.toolStripSeparator5,
this.toolStripButton2});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(909, 37);
this.toolStrip1.TabIndex = 9;
this.toolStrip1.Text = "toolStrip1";
//
// btSearch
//
this.btSearch.Image = ((System.Drawing.Image)(resources.GetObject("btSearch.Image")));
this.btSearch.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btSearch.Name = "btSearch";
this.btSearch.Size = new System.Drawing.Size(104, 34);
this.btSearch.Text = "새로고침(&R)";
this.btSearch.Click += new System.EventHandler(this.btSearch_Click_1);
//
// toolStripSeparator5
//
this.toolStripSeparator5.Name = "toolStripSeparator5";
this.toolStripSeparator5.Size = new System.Drawing.Size(6, 37);
//
// toolStripButton2
//
this.toolStripButton2.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image")));
this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButton2.Name = "toolStripButton2";
this.toolStripButton2.Size = new System.Drawing.Size(65, 34);
this.toolStripButton2.Text = "닫기";
this.toolStripButton2.Click += new System.EventHandler(this.toolStripButton2_Click);
//
// dv1
//
this.dv1.A_DelCurrentCell = true;
this.dv1.A_EnterToTab = true;
this.dv1.A_KoreanField = null;
this.dv1.A_UpperField = null;
this.dv1.A_ViewRownumOnHeader = true;
this.dv1.AllowUserToAddRows = false;
this.dv1.AutoGenerateColumns = false;
this.dv1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.dv1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dv1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.wdateDataGridViewTextBoxColumn,
this.cateDataGridViewTextBoxColumn,
this.titleDataGridViewTextBoxColumn,
this.close,
this.wuid_name,
this.urlDataGridViewTextBoxColumn});
this.dv1.DataSource = this.bs;
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle2.Font = new System.Drawing.Font("굴림", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle2.Padding = new System.Windows.Forms.Padding(3);
dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dv1.DefaultCellStyle = dataGridViewCellStyle2;
this.dv1.Dock = System.Windows.Forms.DockStyle.Top;
this.dv1.Location = new System.Drawing.Point(0, 37);
this.dv1.Name = "dv1";
this.dv1.RowTemplate.Height = 23;
this.dv1.Size = new System.Drawing.Size(909, 258);
this.dv1.TabIndex = 10;
this.dv1.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.dv1_DataError);
//
// bs
//
this.bs.DataMember = "Board";
this.bs.DataSource = this.dsMSSQL;
this.bs.Sort = "close,WDATE DESC";
//
// dsMSSQL
//
this.dsMSSQL.DataSetName = "dsMSSQL";
this.dsMSSQL.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = this.ta;
this.tam.CommonTableAdapter = null;
this.tam.CustomsTableAdapter = null;
this.tam.EETGW_DocuFormTableAdapter = null;
this.tam.HolidayLIstTableAdapter = null;
this.tam.InventoryUserTableAdapter = null;
this.tam.ItemsTableAdapter = null;
this.tam.ProjectsTableAdapter = null;
this.tam.PurchaseTableAdapter = null;
this.tam.RequestItemTableAdapter = null;
this.tam.StaffTableAdapter = null;
this.tam.UpdateOrder = FCM0000.dsMSSQLTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
//
// ta
//
this.ta.ClearBeforeFill = true;
//
// wdateDataGridViewTextBoxColumn
//
this.wdateDataGridViewTextBoxColumn.DataPropertyName = "wdate";
dataGridViewCellStyle1.Format = "yy-MM-dd HH:mm";
this.wdateDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle1;
this.wdateDataGridViewTextBoxColumn.HeaderText = "등록일";
this.wdateDataGridViewTextBoxColumn.Name = "wdateDataGridViewTextBoxColumn";
this.wdateDataGridViewTextBoxColumn.Width = 72;
//
// cateDataGridViewTextBoxColumn
//
this.cateDataGridViewTextBoxColumn.DataPropertyName = "cate";
this.cateDataGridViewTextBoxColumn.HeaderText = "구분";
this.cateDataGridViewTextBoxColumn.Name = "cateDataGridViewTextBoxColumn";
this.cateDataGridViewTextBoxColumn.Width = 60;
//
// titleDataGridViewTextBoxColumn
//
this.titleDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.titleDataGridViewTextBoxColumn.DataPropertyName = "title";
this.titleDataGridViewTextBoxColumn.HeaderText = "화면";
this.titleDataGridViewTextBoxColumn.Name = "titleDataGridViewTextBoxColumn";
//
// close
//
this.close.DataPropertyName = "close";
this.close.FalseValue = "0";
this.close.HeaderText = "종료";
this.close.IndeterminateValue = "0";
this.close.Name = "close";
this.close.TrueValue = "1";
this.close.Width = 41;
//
// wuid_name
//
this.wuid_name.DataPropertyName = "wuid_name";
this.wuid_name.HeaderText = "작성자";
this.wuid_name.Name = "wuid_name";
this.wuid_name.ReadOnly = true;
this.wuid_name.Width = 72;
//
// urlDataGridViewTextBoxColumn
//
this.urlDataGridViewTextBoxColumn.DataPropertyName = "wuid";
this.urlDataGridViewTextBoxColumn.HeaderText = "*";
this.urlDataGridViewTextBoxColumn.Name = "urlDataGridViewTextBoxColumn";
this.urlDataGridViewTextBoxColumn.Width = 42;
//
// fPatchList
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(909, 584);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.dv1);
this.Controls.Add(this.toolStrip1);
this.Controls.Add(this.bn);
this.Name = "fPatchList";
this.Text = "Patch List";
this.Load += new System.EventHandler(this.fRequestItem_Load);
((System.ComponentModel.ISupportInitialize)(this.bn)).EndInit();
this.bn.ResumeLayout(false);
this.bn.PerformLayout();
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.dv1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private dsMSSQL dsMSSQL;
private System.Windows.Forms.BindingSource bs;
private dsMSSQLTableAdapters.TableAdapterManager tam;
private System.Windows.Forms.BindingNavigator bn;
private System.Windows.Forms.ToolStripButton bindingNavigatorAddNewItem;
private System.Windows.Forms.ToolStripLabel bindingNavigatorCountItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorDeleteItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveFirstItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorMovePreviousItem;
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator;
private System.Windows.Forms.ToolStripTextBox bindingNavigatorPositionItem;
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator1;
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveNextItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveLastItem;
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator2;
private System.Windows.Forms.ToolStripButton BTsAVE;
private dsMSSQLTableAdapters.BoardTableAdapter ta;
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripButton btSearch;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
private System.Windows.Forms.ToolStripButton toolStripButton2;
private arCtl.arDatagridView dv1;
private System.Windows.Forms.DataGridViewTextBoxColumn wdateDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn cateDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn titleDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewCheckBoxColumn close;
private System.Windows.Forms.DataGridViewTextBoxColumn wuid_name;
private System.Windows.Forms.DataGridViewTextBoxColumn urlDataGridViewTextBoxColumn;
}
}

View File

@@ -1,101 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NetOffice;
using Outlook = NetOffice.OutlookApi;
using NetOffice.OutlookApi.Enums;
namespace FCM0000
{
public partial class fPatchList : FCOMMON.fBase
{
public fPatchList()
{
InitializeComponent();
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
this.dsMSSQL.Board.TableNewRow += RequestItem_TableNewRow;
}
void RequestItem_TableNewRow(object sender, DataTableNewRowEventArgs e)
{
e.Row["wuid"] = FCOMMON.info.Login.no;
e.Row["wdate"] = DateTime.Now;
e.Row["bidx"] = 5;
e.Row["pidx"] = -1;
e.Row["gcode"] = FCOMMON.info.Login.gcode;
}
private void fRequestItem_Load(object sender, EventArgs e)
{
EnsureVisibleAndUsableSize();
if (FCOMMON.info.Login.level >= 9 || FCOMMON.info.Login.no == "395552")
{
bn.Enabled = true;
BTsAVE.Enabled = true;
}
else
{
bn.Enabled = false;
BTsAVE.Enabled = false;
this.dv1.EditMode = DataGridViewEditMode.EditProgrammatically;
}
refreshData();
}
private void boardBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.bs.EndEdit();
this.tam.UpdateAll(this.dsMSSQL);
}
void refreshData()
{
try
{
this.ta.Fill(this.dsMSSQL.Board,5, "%");
dv1.AutoResizeColumns();
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
private void btSearch_Click(object sender, EventArgs e)
{
refreshData();
}
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
{
this.bs.AddNew();
//var newdr = this.dsMSSQL.Board.NewBoardRow();//.NewRequestItemRow();
//fRequestItem_Add f = new fRequestItem_Add(newdr);
//if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) newdr.Delete();
//else this.dsMSSQL.RequestItem.AddRequestItemRow(newdr);
}
private void btSearch_Click_1(object sender, EventArgs e)
{
refreshData();
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
this.Close();
}
private void dv1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
}
}
}

View File

@@ -1,237 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="bn.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>259, 17</value>
</metadata>
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>122, 17</value>
</metadata>
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="bindingNavigatorDeleteItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAW9JREFUOE+1kE0ow2Ecx3dV3krt4oJaOSCTvIRkMqSxyITIzCQHDouEdnFwIOVC
DrhIDiQl5UTiNG/z2ppafy1S2gX/uDwfY6i1v7Hie3nqeb7fz+/7/FR/Ilwn0G0Exw4fV5GJlXlEZxXC
rIet9bAQvB5Ymgn2sLYAvSZEux7RUQFzE4qQt4bCXAYjPaHvnDoCkLpsRGMB2JqCTGLIijDlwqQ9bEMV
i9OIytR3EMNWcJ/BWH8A6j8/bOGFxwXNxYEvGbMQ9XnQ1/K78KfY3/VXzkMY0qFGG2H4RoLGQshJQNbG
86CNhdrsX9a/uQZTPhQl4rMY4OLofbl3aX7I8uwPC7y/g1YdjyVJuEvT8e1tfwUYteHUxCCfHChDeHmG
QQvokjlOU+PbWA0x3pZnILVVI3uvQyHsbiLnqnGmRCF1NYD8pDhpRxOH7HQoAKZGkFKjceszQbpSrumX
bO+G80MFwKUTxgfgcO/b8D9IpXoFiiMDHIQm0skAAAAASUVORK5CYII=
</value>
</data>
<data name="bindingNavigatorMoveFirstItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAASpJREFUOE9jGDygcNbz/00Lnv/PnPj4P1QIA4S3P8Apx5A789n/VUfe/8elKL77
wf/ghmu4DciY8vT/wn0fsCqK73n4f+n+///9qy/gNiCh58n/aVveYyiKaL8P1pw56/9/r9ITuA2I7Hr0
v3f1BxRFoa33wJpb1wFt7/z73yX/AG4DApsf/q+b/w6uKLjl7v9Fe///7wBqzpjz879d3c//9hnbcRvg
UXX/f/60NyiK7Ipv/0+f8/u/f9e3/zqF7/5bJKzHbYB96d3/2ZNfYyjSTzn/36ToxX+VrE//jSOX4TbA
Iu/O/9T+11gVGSSd+C+b9vW/bvA83AYYZt3+H9byEqci/dTL/zV8p+E2QCftxn+/6od4Fal4TMBtgFPu
lf8gBXgVDULAwAAA8HbAq6XlmnAAAAAASUVORK5CYII=
</value>
</data>
<data name="bindingNavigatorMovePreviousItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAALZJREFUOE9jGDogvP3BfyiTdBDf/eB/cMM18gyI73n4f+n+///9qy+QbkBE+32w
5sxZ//97lZ4gzYDQ1ntgza3rgLZ3/v3vkn+AeAOCW+7+X7T3//8OoOaMOT//29X9/G+fsZ00F9gV3/6f
Puf3f/+ub/91Ct/9t0hYT3oY6Kec/29S9OK/Stan/8aRy0g3AAQMkk78l037+l83eB55BoCAfurl/xq+
08g3AARUPCZQZsBgBQwMANAUYJgEulBVAAAAAElFTkSuQmCC
</value>
</data>
<data name="bindingNavigatorMoveNextItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAKNJREFUOE9jGHygcNbz/1AmeSB35rP/Cd33yDckY8rT//P2//6f0HWHPEMSep78
n73v1//OrX//u5VeJt2QyK5H/6ds+/W/ZOnf/wnT//63yT1LmiGBzQ//t659D9ZsXPLlv3T0tf/GkcuI
N8Sj6v7/krnv4JoVXXpIc4F96d3/gS3PyNMMAhZ5d/7bFFwhTzMIGGbdJl8zCOik3SBf81AEDAwAoH5f
oAc0QjgAAAAASUVORK5CYII=
</value>
</data>
<data name="bindingNavigatorMoveLastItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAASxJREFUOE9jGFygcNbz/1AmBgDJNS14/j9z4mOcahhyZz77n9B9D6sCkNyqI+//
h7c/wG1AxpSn/+ft//0/oesOhiKQ3MJ9H/4HN1zDbUBCz5P/s/f9+t+59e9/t9LLKApBctO2vP/vX30B
twGRXY/+T9n263/J0r//E6b//W+TexauGCTXu/rDf6/SE7gNCGx++L917XuwZuOSL/+lo6/9N45cBtYA
kqub/+6/S/4B3AZ4VN3/XzL3HVyzoksPXDFILn/am//2GdtxG2Bfevd/YMszDM0gAJLLnvz6v0XCetwG
WOTd+W9TcAVDMwiA5FL7X8O9hBUYZt3GqhkEQHJhLS//6wbPw22ATtoNnJIgOb/qh/81fKfhNgAfcMq9
8l/FYwIYQ4UGBWBgAAC+0b+zuQxOnAAAAABJRU5ErkJggg==
</value>
</data>
<data name="bindingNavigatorAddNewItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAUpJREFUOE9jGLzg7gL2/7fmcf6/Oofr/8UZvP+hwsSD60CNfx41/v/zsOH/yckC
pBtwfjov3ICDPSKkG3B8kiBQc93/Pw+q/u9oFydswKWZPP/PTuX7fxKo8Ui/0P993SJAzeX//94r+r++
Qeb/qhq5/0srFf/PL1X+P6tIFdPAU0B//nlYD9RUC8SV///cKwHivP9/72b+/3sn+f/f23H//92MAOKQ
/5NyNDENONQrDHbu3/ulQI0FQI3ZQI2pQI0J///digZqDPv/70bQ/3/X/f53peliGrCzXeL/lmap/+vA
zpX/v6RC8f/fWzFAjeH/p+Zp/J+QpfW/O0P3f3uq/v/mREPCYTIb6E+Qc//dCPjfk6FDWAM6APnz3w1/
IPb735qsT7oB3em6YP+CcH2cEekGtCQZ/G+IN/xfE2v8vzLahHQD6AQYGAAkI9iedfyIaQAAAABJRU5E
rkJggg==
</value>
</data>
<data name="BTsAVE.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
</value>
</data>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>608, 17</value>
</metadata>
<data name="btSearch.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE4SURBVDhPtZPPasJAEMbzPn0FwWA92JtP4NGKB1/DP7ei
QSsovkChh7ZBrCfpyR4sikopUgq9StFzM/UbZ5asSS4FfzAkO7vft5udiZMEnSBpk5dhFJmncjdHxXaG
A+9K4SbFT1luEwQBbXavVO5d0nI3ovnW5yeiMriiu+kt5asXbABEdgRigAUQDr+aHLU3lxoLl/yPJhvF
GsiYJ/vPdX5qPK3bVJ25VFukafztGQNsKHJ791I3w+8KcpNth8XDz5YxACI/gsR1J8sTYcO4UIzwv1gG
cTshgJ5IT8hChTMHsHi+v+fvffmxywVwN2FDkdsGEOK2ceu4feQ0tDqKyKMGqDfqjvprLzyswuX7Tf4E
dBo6zn/3OB7XHovRyuhQ6+hhYKA9DpL+A1keRebNAhkaJH0OHOcP031C4EjYr6wAAAAASUVORK5CYII=
</value>
</data>
<data name="toolStripButton2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADlSURBVEhL7dQxCsIwFMbxnMrZWatzUXRUCo5ewSs4ewZR
DyDeQfEETsUbRL7YYNSXNC/UOiQP/kvzyE9KUcQ7y/VJtlHFvQYPjzf50xKsJsFmq81WHq538swMO9il
zhALxkWd7kAOJwsnjjPsYNeGs2B14fR5YTYq5O5c1u7sL987iAUjF+6LIjaMKJyDoiAYmVAvn8lsXHij
KBhGwDWof4APihqHqQ+OKhg2X3U/n7+9ah88CKY+pM9ndTgbplDbmQtnwS7UtmPDWfDf/jIRLnKhOuzY
UMSGmyrBauKE26jiohshHicE2B3dbRrmAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="close.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="wuid_name.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>186, 17</value>
</metadata>
<metadata name="ta.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>325, 17</value>
</metadata>
</root>

View File

@@ -1,592 +0,0 @@
namespace FCM0000
{
partial class fRequestItem
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fRequestItem));
this.bn = new System.Windows.Forms.BindingNavigator(this.components);
this.bs = new System.Windows.Forms.BindingSource(this.components);
this.dsMSSQL = new FCM0000.dsMSSQL();
this.bindingNavigatorCountItem = new System.Windows.Forms.ToolStripLabel();
this.bindingNavigatorDeleteItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMoveFirstItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMovePreviousItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorSeparator = new System.Windows.Forms.ToolStripSeparator();
this.bindingNavigatorPositionItem = new System.Windows.Forms.ToolStripTextBox();
this.bindingNavigatorSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.bindingNavigatorMoveNextItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMoveLastItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.bindingNavigatorAddNewItem = new System.Windows.Forms.ToolStripButton();
this.boardBindingNavigatorSaveItem = new System.Windows.Forms.ToolStripButton();
this.dv1 = new System.Windows.Forms.DataGridView();
this.pdateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.titleDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.model = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.sidDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.qtyDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.project = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.bMail = new System.Windows.Forms.DataGridViewCheckBoxColumn();
this.memo = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.cm = new System.Windows.Forms.ContextMenuStrip(this.components);
this.autoResizeColumnsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
this.mailPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mailPreviewAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
this.dtSD = new System.Windows.Forms.ToolStripTextBox();
this.toolStripLabel4 = new System.Windows.Forms.ToolStripLabel();
this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel();
this.dtED = new System.Windows.Forms.ToolStripTextBox();
this.btSearch = new System.Windows.Forms.ToolStripButton();
this.label1 = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.label7 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.tam = new FCM0000.dsMSSQLTableAdapters.TableAdapterManager();
this.ta = new FCM0000.dsMSSQLTableAdapters.RequestItemTableAdapter();
((System.ComponentModel.ISupportInitialize)(this.bn)).BeginInit();
this.bn.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dv1)).BeginInit();
this.cm.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// bn
//
this.bn.AddNewItem = null;
this.bn.BindingSource = this.bs;
this.bn.CountItem = this.bindingNavigatorCountItem;
this.bn.DeleteItem = this.bindingNavigatorDeleteItem;
this.bn.Dock = System.Windows.Forms.DockStyle.Bottom;
this.bn.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.bindingNavigatorMoveFirstItem,
this.bindingNavigatorMovePreviousItem,
this.bindingNavigatorSeparator,
this.bindingNavigatorPositionItem,
this.bindingNavigatorCountItem,
this.bindingNavigatorSeparator1,
this.bindingNavigatorMoveNextItem,
this.bindingNavigatorMoveLastItem,
this.bindingNavigatorSeparator2,
this.bindingNavigatorAddNewItem,
this.bindingNavigatorDeleteItem,
this.boardBindingNavigatorSaveItem});
this.bn.Location = new System.Drawing.Point(0, 550);
this.bn.MoveFirstItem = this.bindingNavigatorMoveFirstItem;
this.bn.MoveLastItem = this.bindingNavigatorMoveLastItem;
this.bn.MoveNextItem = this.bindingNavigatorMoveNextItem;
this.bn.MovePreviousItem = this.bindingNavigatorMovePreviousItem;
this.bn.Name = "bn";
this.bn.PositionItem = this.bindingNavigatorPositionItem;
this.bn.Size = new System.Drawing.Size(1046, 25);
this.bn.TabIndex = 0;
this.bn.Text = "bindingNavigator1";
//
// bs
//
this.bs.DataMember = "RequestItem";
this.bs.DataSource = this.dsMSSQL;
//
// dsMSSQL
//
this.dsMSSQL.DataSetName = "dsMSSQL";
this.dsMSSQL.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// bindingNavigatorCountItem
//
this.bindingNavigatorCountItem.Name = "bindingNavigatorCountItem";
this.bindingNavigatorCountItem.Size = new System.Drawing.Size(27, 22);
this.bindingNavigatorCountItem.Text = "/{0}";
this.bindingNavigatorCountItem.ToolTipText = "전체 항목 수";
//
// bindingNavigatorDeleteItem
//
this.bindingNavigatorDeleteItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorDeleteItem.Image")));
this.bindingNavigatorDeleteItem.Name = "bindingNavigatorDeleteItem";
this.bindingNavigatorDeleteItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorDeleteItem.Size = new System.Drawing.Size(78, 22);
this.bindingNavigatorDeleteItem.Text = "Delete(&D)";
//
// bindingNavigatorMoveFirstItem
//
this.bindingNavigatorMoveFirstItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMoveFirstItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveFirstItem.Image")));
this.bindingNavigatorMoveFirstItem.Name = "bindingNavigatorMoveFirstItem";
this.bindingNavigatorMoveFirstItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMoveFirstItem.Size = new System.Drawing.Size(23, 22);
this.bindingNavigatorMoveFirstItem.Text = "처음으로 이동";
//
// bindingNavigatorMovePreviousItem
//
this.bindingNavigatorMovePreviousItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMovePreviousItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMovePreviousItem.Image")));
this.bindingNavigatorMovePreviousItem.Name = "bindingNavigatorMovePreviousItem";
this.bindingNavigatorMovePreviousItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMovePreviousItem.Size = new System.Drawing.Size(23, 22);
this.bindingNavigatorMovePreviousItem.Text = "이전으로 이동";
//
// bindingNavigatorSeparator
//
this.bindingNavigatorSeparator.Name = "bindingNavigatorSeparator";
this.bindingNavigatorSeparator.Size = new System.Drawing.Size(6, 25);
//
// bindingNavigatorPositionItem
//
this.bindingNavigatorPositionItem.AccessibleName = "위치";
this.bindingNavigatorPositionItem.AutoSize = false;
this.bindingNavigatorPositionItem.Name = "bindingNavigatorPositionItem";
this.bindingNavigatorPositionItem.Size = new System.Drawing.Size(50, 23);
this.bindingNavigatorPositionItem.Text = "0";
this.bindingNavigatorPositionItem.ToolTipText = "현재 위치";
//
// bindingNavigatorSeparator1
//
this.bindingNavigatorSeparator1.Name = "bindingNavigatorSeparator1";
this.bindingNavigatorSeparator1.Size = new System.Drawing.Size(6, 25);
//
// bindingNavigatorMoveNextItem
//
this.bindingNavigatorMoveNextItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMoveNextItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveNextItem.Image")));
this.bindingNavigatorMoveNextItem.Name = "bindingNavigatorMoveNextItem";
this.bindingNavigatorMoveNextItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMoveNextItem.Size = new System.Drawing.Size(23, 22);
this.bindingNavigatorMoveNextItem.Text = "다음으로 이동";
//
// bindingNavigatorMoveLastItem
//
this.bindingNavigatorMoveLastItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMoveLastItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveLastItem.Image")));
this.bindingNavigatorMoveLastItem.Name = "bindingNavigatorMoveLastItem";
this.bindingNavigatorMoveLastItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMoveLastItem.Size = new System.Drawing.Size(23, 22);
this.bindingNavigatorMoveLastItem.Text = "마지막으로 이동";
//
// bindingNavigatorSeparator2
//
this.bindingNavigatorSeparator2.Name = "bindingNavigatorSeparator2";
this.bindingNavigatorSeparator2.Size = new System.Drawing.Size(6, 25);
//
// bindingNavigatorAddNewItem
//
this.bindingNavigatorAddNewItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorAddNewItem.Image")));
this.bindingNavigatorAddNewItem.Name = "bindingNavigatorAddNewItem";
this.bindingNavigatorAddNewItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorAddNewItem.Size = new System.Drawing.Size(65, 22);
this.bindingNavigatorAddNewItem.Text = "Add(&A)";
this.bindingNavigatorAddNewItem.Click += new System.EventHandler(this.bindingNavigatorAddNewItem_Click);
//
// boardBindingNavigatorSaveItem
//
this.boardBindingNavigatorSaveItem.Image = ((System.Drawing.Image)(resources.GetObject("boardBindingNavigatorSaveItem.Image")));
this.boardBindingNavigatorSaveItem.Name = "boardBindingNavigatorSaveItem";
this.boardBindingNavigatorSaveItem.Size = new System.Drawing.Size(67, 22);
this.boardBindingNavigatorSaveItem.Text = "Save(&S)";
this.boardBindingNavigatorSaveItem.Click += new System.EventHandler(this.boardBindingNavigatorSaveItem_Click);
//
// dv1
//
this.dv1.AllowUserToAddRows = false;
this.dv1.AllowUserToDeleteRows = false;
this.dv1.AutoGenerateColumns = false;
this.dv1.ColumnHeadersHeight = 30;
this.dv1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
this.dv1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.pdateDataGridViewTextBoxColumn,
this.titleDataGridViewTextBoxColumn,
this.model,
this.sidDataGridViewTextBoxColumn,
this.qtyDataGridViewTextBoxColumn,
this.project,
this.bMail,
this.memo});
this.dv1.ContextMenuStrip = this.cm;
this.dv1.DataSource = this.bs;
this.dv1.Dock = System.Windows.Forms.DockStyle.Fill;
this.dv1.Location = new System.Drawing.Point(0, 25);
this.dv1.MultiSelect = false;
this.dv1.Name = "dv1";
this.dv1.ReadOnly = true;
this.dv1.RowTemplate.Height = 23;
this.dv1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dv1.Size = new System.Drawing.Size(874, 505);
this.dv1.TabIndex = 2;
this.dv1.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.dv1_DataError);
this.dv1.DoubleClick += new System.EventHandler(this.boardDataGridView_DoubleClick);
//
// pdateDataGridViewTextBoxColumn
//
this.pdateDataGridViewTextBoxColumn.DataPropertyName = "pdate";
this.pdateDataGridViewTextBoxColumn.HeaderText = "Pdate";
this.pdateDataGridViewTextBoxColumn.Name = "pdateDataGridViewTextBoxColumn";
this.pdateDataGridViewTextBoxColumn.ReadOnly = true;
//
// titleDataGridViewTextBoxColumn
//
this.titleDataGridViewTextBoxColumn.DataPropertyName = "title";
this.titleDataGridViewTextBoxColumn.HeaderText = "Item";
this.titleDataGridViewTextBoxColumn.Name = "titleDataGridViewTextBoxColumn";
this.titleDataGridViewTextBoxColumn.ReadOnly = true;
//
// model
//
this.model.DataPropertyName = "model";
this.model.HeaderText = "Model";
this.model.Name = "model";
this.model.ReadOnly = true;
//
// sidDataGridViewTextBoxColumn
//
this.sidDataGridViewTextBoxColumn.DataPropertyName = "sid";
this.sidDataGridViewTextBoxColumn.HeaderText = "sid";
this.sidDataGridViewTextBoxColumn.Name = "sidDataGridViewTextBoxColumn";
this.sidDataGridViewTextBoxColumn.ReadOnly = true;
//
// qtyDataGridViewTextBoxColumn
//
this.qtyDataGridViewTextBoxColumn.DataPropertyName = "qty";
this.qtyDataGridViewTextBoxColumn.HeaderText = "qty";
this.qtyDataGridViewTextBoxColumn.Name = "qtyDataGridViewTextBoxColumn";
this.qtyDataGridViewTextBoxColumn.ReadOnly = true;
//
// project
//
this.project.DataPropertyName = "projectName";
this.project.HeaderText = "project";
this.project.Name = "project";
this.project.ReadOnly = true;
//
// bMail
//
this.bMail.DataPropertyName = "bMail";
this.bMail.HeaderText = "Mail";
this.bMail.Name = "bMail";
this.bMail.ReadOnly = true;
//
// memo
//
this.memo.DataPropertyName = "memo";
this.memo.HeaderText = "memo";
this.memo.Name = "memo";
this.memo.ReadOnly = true;
//
// cm
//
this.cm.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.autoResizeColumnsToolStripMenuItem,
this.toolStripMenuItem1,
this.mailPreviewToolStripMenuItem,
this.mailPreviewAllToolStripMenuItem});
this.cm.Name = "cm";
this.cm.Size = new System.Drawing.Size(182, 76);
//
// autoResizeColumnsToolStripMenuItem
//
this.autoResizeColumnsToolStripMenuItem.Name = "autoResizeColumnsToolStripMenuItem";
this.autoResizeColumnsToolStripMenuItem.Size = new System.Drawing.Size(181, 22);
this.autoResizeColumnsToolStripMenuItem.Text = "AutoResizeColumns";
this.autoResizeColumnsToolStripMenuItem.Click += new System.EventHandler(this.autoResizeColumnsToolStripMenuItem_Click);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(178, 6);
//
// mailPreviewToolStripMenuItem
//
this.mailPreviewToolStripMenuItem.Name = "mailPreviewToolStripMenuItem";
this.mailPreviewToolStripMenuItem.Size = new System.Drawing.Size(181, 22);
this.mailPreviewToolStripMenuItem.Text = "Mail(Preview_One)";
this.mailPreviewToolStripMenuItem.Click += new System.EventHandler(this.mailPreviewToolStripMenuItem_Click);
//
// mailPreviewAllToolStripMenuItem
//
this.mailPreviewAllToolStripMenuItem.Name = "mailPreviewAllToolStripMenuItem";
this.mailPreviewAllToolStripMenuItem.Size = new System.Drawing.Size(181, 22);
this.mailPreviewAllToolStripMenuItem.Text = "Mail(Preview_All)";
this.mailPreviewAllToolStripMenuItem.Click += new System.EventHandler(this.mailPreviewAllToolStripMenuItem_Click);
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripLabel1,
this.dtSD,
this.toolStripLabel4,
this.toolStripLabel2,
this.dtED,
this.btSearch});
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(1046, 25);
this.toolStrip1.TabIndex = 4;
this.toolStrip1.Text = "toolStrip1";
//
// toolStripLabel1
//
this.toolStripLabel1.Name = "toolStripLabel1";
this.toolStripLabel1.Size = new System.Drawing.Size(32, 22);
this.toolStripLabel1.Text = "Start";
//
// dtSD
//
this.dtSD.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.dtSD.Name = "dtSD";
this.dtSD.Size = new System.Drawing.Size(100, 25);
//
// toolStripLabel4
//
this.toolStripLabel4.Name = "toolStripLabel4";
this.toolStripLabel4.Size = new System.Drawing.Size(15, 22);
this.toolStripLabel4.Text = "~";
//
// toolStripLabel2
//
this.toolStripLabel2.Name = "toolStripLabel2";
this.toolStripLabel2.Size = new System.Drawing.Size(27, 22);
this.toolStripLabel2.Text = "End";
//
// dtED
//
this.dtED.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.dtED.Name = "dtED";
this.dtED.Size = new System.Drawing.Size(100, 25);
//
// btSearch
//
this.btSearch.Image = ((System.Drawing.Image)(resources.GetObject("btSearch.Image")));
this.btSearch.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btSearch.Name = "btSearch";
this.btSearch.Size = new System.Drawing.Size(81, 22);
this.btSearch.Text = "Refresh(&R)";
this.btSearch.Click += new System.EventHandler(this.btSearch_Click);
//
// label1
//
this.label1.BackColor = System.Drawing.Color.DeepSkyBlue;
this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "url", true));
this.label1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.label1.ForeColor = System.Drawing.Color.White;
this.label1.Location = new System.Drawing.Point(0, 530);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(1046, 20);
this.label1.TabIndex = 5;
this.label1.Text = "-- URL --";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.label1.Click += new System.EventHandler(this.label1_Click);
//
// panel1
//
this.panel1.Controls.Add(this.label7);
this.panel1.Controls.Add(this.label6);
this.panel1.Controls.Add(this.label5);
this.panel1.Controls.Add(this.label4);
this.panel1.Controls.Add(this.label3);
this.panel1.Controls.Add(this.label2);
this.panel1.Dock = System.Windows.Forms.DockStyle.Right;
this.panel1.Location = new System.Drawing.Point(874, 25);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(172, 505);
this.panel1.TabIndex = 7;
//
// label7
//
this.label7.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "bcclist", true));
this.label7.Dock = System.Windows.Forms.DockStyle.Fill;
this.label7.Location = new System.Drawing.Point(0, 300);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(172, 205);
this.label7.TabIndex = 5;
this.label7.Text = "--";
this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label6
//
this.label6.BackColor = System.Drawing.Color.Gray;
this.label6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.label6.Dock = System.Windows.Forms.DockStyle.Top;
this.label6.ForeColor = System.Drawing.Color.White;
this.label6.Location = new System.Drawing.Point(0, 270);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(172, 30);
this.label6.TabIndex = 4;
this.label6.Text = "BCC List";
this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label5
//
this.label5.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "cclist", true));
this.label5.Dock = System.Windows.Forms.DockStyle.Top;
this.label5.Location = new System.Drawing.Point(0, 165);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(172, 105);
this.label5.TabIndex = 3;
this.label5.Text = "--";
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label4
//
this.label4.BackColor = System.Drawing.Color.Gray;
this.label4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.label4.Dock = System.Windows.Forms.DockStyle.Top;
this.label4.ForeColor = System.Drawing.Color.White;
this.label4.Location = new System.Drawing.Point(0, 135);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(172, 30);
this.label4.TabIndex = 2;
this.label4.Text = "CC List";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label3
//
this.label3.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "tolist", true));
this.label3.Dock = System.Windows.Forms.DockStyle.Top;
this.label3.Location = new System.Drawing.Point(0, 30);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(172, 105);
this.label3.TabIndex = 1;
this.label3.Text = "--";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label2
//
this.label2.BackColor = System.Drawing.Color.Gray;
this.label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.label2.Dock = System.Windows.Forms.DockStyle.Top;
this.label2.ForeColor = System.Drawing.Color.White;
this.label2.Location = new System.Drawing.Point(0, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(172, 30);
this.label2.TabIndex = 0;
this.label2.Text = "TO List";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.CommonTableAdapter = null;
this.tam.CustomsTableAdapter = null;
this.tam.ItemsTableAdapter = null;
this.tam.ProjectsTableAdapter = null;
this.tam.PurchaseTableAdapter = null;
this.tam.RequestItemTableAdapter = this.ta;
this.tam.StaffTableAdapter = null;
this.tam.UpdateOrder = FCM0000.dsMSSQLTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
//
// ta
//
this.ta.ClearBeforeFill = true;
//
// fRequestItem
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1046, 575);
this.Controls.Add(this.dv1);
this.Controls.Add(this.panel1);
this.Controls.Add(this.label1);
this.Controls.Add(this.toolStrip1);
this.Controls.Add(this.bn);
this.Name = "fRequestItem";
this.Text = "Patch List";
this.Load += new System.EventHandler(this.fRequestItem_Load);
((System.ComponentModel.ISupportInitialize)(this.bn)).EndInit();
this.bn.ResumeLayout(false);
this.bn.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dv1)).EndInit();
this.cm.ResumeLayout(false);
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private dsMSSQL dsMSSQL;
private System.Windows.Forms.BindingSource bs;
private dsMSSQLTableAdapters.TableAdapterManager tam;
private System.Windows.Forms.BindingNavigator bn;
private System.Windows.Forms.ToolStripButton bindingNavigatorAddNewItem;
private System.Windows.Forms.ToolStripLabel bindingNavigatorCountItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorDeleteItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveFirstItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorMovePreviousItem;
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator;
private System.Windows.Forms.ToolStripTextBox bindingNavigatorPositionItem;
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator1;
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveNextItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveLastItem;
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator2;
private System.Windows.Forms.ToolStripButton boardBindingNavigatorSaveItem;
private System.Windows.Forms.DataGridView dv1;
private System.Windows.Forms.ToolStrip toolStrip1;
private System.Windows.Forms.ToolStripLabel toolStripLabel1;
private System.Windows.Forms.ToolStripTextBox dtSD;
private System.Windows.Forms.ToolStripLabel toolStripLabel4;
private System.Windows.Forms.ToolStripLabel toolStripLabel2;
private System.Windows.Forms.ToolStripTextBox dtED;
private System.Windows.Forms.ToolStripButton btSearch;
private dsMSSQLTableAdapters.RequestItemTableAdapter ta;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ContextMenuStrip cm;
private System.Windows.Forms.ToolStripMenuItem mailPreviewToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem autoResizeColumnsToolStripMenuItem;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.ToolStripMenuItem mailPreviewAllToolStripMenuItem;
private System.Windows.Forms.DataGridViewTextBoxColumn pdateDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn titleDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn model;
private System.Windows.Forms.DataGridViewTextBoxColumn sidDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn qtyDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn project;
private System.Windows.Forms.DataGridViewCheckBoxColumn bMail;
private System.Windows.Forms.DataGridViewTextBoxColumn memo;
}
}

View File

@@ -1,191 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NetOffice;
using Outlook = NetOffice.OutlookApi;
using NetOffice.OutlookApi.Enums;
namespace FCM0000
{
public partial class fRequestItem : FCOMMON.fBase
{
public fRequestItem()
{
InitializeComponent();
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
this.dsMSSQL.RequestItem.TableNewRow += RequestItem_TableNewRow;
}
void RequestItem_TableNewRow(object sender, DataTableNewRowEventArgs e)
{
e.Row["wuid"] = FCOMMON.info.Login.no;
e.Row["wdate"] = DateTime.Now;
e.Row["pdate"] = DateTime.Now.ToShortDateString();
e.Row["qty"] = 1;
}
private void fRequestItem_Load(object sender, EventArgs e)
{
EnsureVisibleAndUsableSize();
this.dtSD.Text = DateTime.Now.AddDays(-15).ToShortDateString();
this.dtED.Text = DateTime.Now.ToShortDateString();
refreshData();
}
private void boardBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.bs.EndEdit();
this.tam.UpdateAll(this.dsMSSQL);
}
void refreshData()
{
try
{
this.ta.Fill(this.dsMSSQL.RequestItem, dtSD.Text, dtED.Text);
this.dv1.AutoResizeColumns();
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
private void btSearch_Click(object sender, EventArgs e)
{
refreshData();
}
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
{
var newdr = this.dsMSSQL.RequestItem.NewRequestItemRow();
fRequestItem_Add f = new fRequestItem_Add(newdr);
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) newdr.Delete();
else this.dsMSSQL.RequestItem.AddRequestItemRow(newdr);
}
private void label1_Click(object sender, EventArgs e)
{
if (label1.Text != "")
FCOMMON.Util.RunExplorer(label1.Text);
}
private void boardDataGridView_DoubleClick(object sender, EventArgs e)
{
var drv = this.bs.Current as DataRowView;
if (drv == null) return;
var dr = drv.Row as dsMSSQL.RequestItemRow;
var f = new fRequestItem_Add(dr);
if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK)
dr.RejectChanges();
}
private void mailPreviewToolStripMenuItem_Click(object sender, EventArgs e)
{
var drv = this.bs.Current as DataRowView;
if (drv == null) return;
var dr = drv.Row as dsMSSQL.RequestItemRow;
//자로에서 불러와서 그 값을 가져온다.s
string subject = "[AMKOR-K4] 견적문의";
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
var data = taMF.GetByCate(FCOMMON.info.Login.gcode, "BY");
if (data != null && data.Rows.Count > 0)
{
var drForm = data.Rows[0] as DSMail.MailFormRow;
subject = drForm.subject;
}
var tolist = dr.tolist.Split(',');
Outlook.Application outlookApplication = new Outlook.Application();
foreach(var to in tolist)
{
if (to.isEmpty()) continue;
var newMail = outlookApplication.CreateItem(OlItemType.olMailItem) as Outlook.MailItem;
newMail.Subject = subject; // dr.title;
newMail.To = to;
newMail.CC = dr.cclist;
newMail.BCC = dr.bcclist;
newMail.HTMLBody = dr.remark
.Replace("{USER}", FCOMMON.info.Login.nameK)
.Replace("{EUSER}", FCOMMON.info.Login.nameE)
.Replace("{EMAIL}", FCOMMON.info.Login.email)
.Replace("%7BEMAIL%7D", FCOMMON.info.Login.email)
.Replace("{HP}", FCOMMON.info.Login.hp)
.Replace("{TEL}", FCOMMON.info.Login.tel)
.Replace("{ITEM}", dr.title)
.Replace("{QTY}",dr.qty.ToString())
.Replace("{MODEL}", dr.model.ToString())
.Replace("%7BURL%7D", dr.url.ToString())
.Replace("{URL}",dr.url);
newMail.BodyFormat = OlBodyFormat.olFormatHTML;
newMail.Display();
break;
}
}
private void autoResizeColumnsToolStripMenuItem_Click(object sender, EventArgs e)
{
dv1.AutoResizeColumns();
}
private void mailPreviewAllToolStripMenuItem_Click(object sender, EventArgs e)
{
var drv = this.bs.Current as DataRowView;
if (drv == null) return;
var dr = drv.Row as dsMSSQL.RequestItemRow;
//자로에서 불러와서 그 값을 가져온다.s
string subject = "[AMKOR-K4] 견적문의";
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
var data = taMF.GetByCate(FCOMMON.info.Login.gcode, "BY");
if (data != null && data.Rows.Count > 0)
{
var drForm = data.Rows[0] as DSMail.MailFormRow;
subject = drForm.subject;
}
var tolist = dr.tolist.Split(',');
Outlook.Application outlookApplication = new Outlook.Application();
foreach (var to in tolist)
{
if (to.isEmpty()) continue;
var newMail = outlookApplication.CreateItem(OlItemType.olMailItem) as Outlook.MailItem;
newMail.Subject = subject; // dr.title;
newMail.To = to;
newMail.CC = dr.cclist;
newMail.BCC = dr.bcclist;
newMail.HTMLBody = dr.remark
.Replace("{USER}", FCOMMON.info.Login.nameK)
.Replace("{EUSER}", FCOMMON.info.Login.nameE)
.Replace("{EMAIL}", FCOMMON.info.Login.email)
.Replace("%7BEMAIL%7D", FCOMMON.info.Login.email)
.Replace("{HP}", FCOMMON.info.Login.hp)
.Replace("{TEL}", FCOMMON.info.Login.tel)
.Replace("{ITEM}", dr.title)
.Replace("{QTY}", dr.qty.ToString())
.Replace("{MODEL}", dr.model.ToString())
.Replace("%7BURL%7D", dr.url.ToString())
.Replace("{URL}", dr.url);
newMail.BodyFormat = OlBodyFormat.olFormatHTML;
newMail.Display();
}
}
private void dv1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
}
}
}

View File

@@ -1,236 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="bn.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>259, 17</value>
</metadata>
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>122, 17</value>
</metadata>
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="bindingNavigatorDeleteItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAW9JREFUOE+1kE0ow2Ecx3dV3krt4oJaOSCTvIRkMqSxyITIzCQHDouEdnFwIOVC
DrhIDiQl5UTiNG/z2ppafy1S2gX/uDwfY6i1v7Hie3nqeb7fz+/7/FR/Ilwn0G0Exw4fV5GJlXlEZxXC
rIet9bAQvB5Ymgn2sLYAvSZEux7RUQFzE4qQt4bCXAYjPaHvnDoCkLpsRGMB2JqCTGLIijDlwqQ9bEMV
i9OIytR3EMNWcJ/BWH8A6j8/bOGFxwXNxYEvGbMQ9XnQ1/K78KfY3/VXzkMY0qFGG2H4RoLGQshJQNbG
86CNhdrsX9a/uQZTPhQl4rMY4OLofbl3aX7I8uwPC7y/g1YdjyVJuEvT8e1tfwUYteHUxCCfHChDeHmG
QQvokjlOU+PbWA0x3pZnILVVI3uvQyHsbiLnqnGmRCF1NYD8pDhpRxOH7HQoAKZGkFKjceszQbpSrumX
bO+G80MFwKUTxgfgcO/b8D9IpXoFiiMDHIQm0skAAAAASUVORK5CYII=
</value>
</data>
<data name="bindingNavigatorMoveFirstItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAASpJREFUOE9jGDygcNbz/00Lnv/PnPj4P1QIA4S3P8Apx5A789n/VUfe/8elKL77
wf/ghmu4DciY8vT/wn0fsCqK73n4f+n+///9qy/gNiCh58n/aVveYyiKaL8P1pw56/9/r9ITuA2I7Hr0
v3f1BxRFoa33wJpb1wFt7/z73yX/AG4DApsf/q+b/w6uKLjl7v9Fe///7wBqzpjz879d3c//9hnbcRvg
UXX/f/60NyiK7Ipv/0+f8/u/f9e3/zqF7/5bJKzHbYB96d3/2ZNfYyjSTzn/36ToxX+VrE//jSOX4TbA
Iu/O/9T+11gVGSSd+C+b9vW/bvA83AYYZt3+H9byEqci/dTL/zV8p+E2QCftxn+/6od4Fal4TMBtgFPu
lf8gBXgVDULAwAAA8HbAq6XlmnAAAAAASUVORK5CYII=
</value>
</data>
<data name="bindingNavigatorMovePreviousItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAALZJREFUOE9jGDogvP3BfyiTdBDf/eB/cMM18gyI73n4f+n+///9qy+QbkBE+32w
5sxZ//97lZ4gzYDQ1ntgza3rgLZ3/v3vkn+AeAOCW+7+X7T3//8OoOaMOT//29X9/G+fsZ00F9gV3/6f
Puf3f/+ub/91Ct/9t0hYT3oY6Kec/29S9OK/Stan/8aRy0g3AAQMkk78l037+l83eB55BoCAfurl/xq+
08g3AARUPCZQZsBgBQwMANAUYJgEulBVAAAAAElFTkSuQmCC
</value>
</data>
<data name="bindingNavigatorMoveNextItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAKNJREFUOE9jGHygcNbz/1AmeSB35rP/Cd33yDckY8rT//P2//6f0HWHPEMSep78
n73v1//OrX//u5VeJt2QyK5H/6ds+/W/ZOnf/wnT//63yT1LmiGBzQ//t659D9ZsXPLlv3T0tf/GkcuI
N8Sj6v7/krnv4JoVXXpIc4F96d3/gS3PyNMMAhZ5d/7bFFwhTzMIGGbdJl8zCOik3SBf81AEDAwAoH5f
oAc0QjgAAAAASUVORK5CYII=
</value>
</data>
<data name="bindingNavigatorMoveLastItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAASxJREFUOE9jGFygcNbz/1AmBgDJNS14/j9z4mOcahhyZz77n9B9D6sCkNyqI+//
h7c/wG1AxpSn/+ft//0/oesOhiKQ3MJ9H/4HN1zDbUBCz5P/s/f9+t+59e9/t9LLKApBctO2vP/vX30B
twGRXY/+T9n263/J0r//E6b//W+TexauGCTXu/rDf6/SE7gNCGx++L917XuwZuOSL/+lo6/9N45cBtYA
kqub/+6/S/4B3AZ4VN3/XzL3HVyzoksPXDFILn/am//2GdtxG2Bfevd/YMszDM0gAJLLnvz6v0XCetwG
WOTd+W9TcAVDMwiA5FL7X8O9hBUYZt3GqhkEQHJhLS//6wbPw22ATtoNnJIgOb/qh/81fKfhNgAfcMq9
8l/FYwIYQ4UGBWBgAAC+0b+zuQxOnAAAAABJRU5ErkJggg==
</value>
</data>
<data name="bindingNavigatorAddNewItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAUpJREFUOE9jGLzg7gL2/7fmcf6/Oofr/8UZvP+hwsSD60CNfx41/v/zsOH/yckC
pBtwfjov3ICDPSKkG3B8kiBQc93/Pw+q/u9oFydswKWZPP/PTuX7fxKo8Ui/0P993SJAzeX//94r+r++
Qeb/qhq5/0srFf/PL1X+P6tIFdPAU0B//nlYD9RUC8SV///cKwHivP9/72b+/3sn+f/f23H//92MAOKQ
/5NyNDENONQrDHbu3/ulQI0FQI3ZQI2pQI0J///digZqDPv/70bQ/3/X/f53peliGrCzXeL/lmap/+vA
zpX/v6RC8f/fWzFAjeH/p+Zp/J+QpfW/O0P3f3uq/v/mREPCYTIb6E+Qc//dCPjfk6FDWAM6APnz3w1/
IPb735qsT7oB3em6YP+CcH2cEekGtCQZ/G+IN/xfE2v8vzLahHQD6AQYGAAkI9iedfyIaQAAAABJRU5E
rkJggg==
</value>
</data>
<data name="boardBindingNavigatorSaveItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
</value>
</data>
<metadata name="model.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="project.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="bMail.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="memo.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="cm.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>493, 17</value>
</metadata>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>325, 17</value>
</metadata>
<data name="btSearch.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE4SURBVDhPtZPPasJAEMbzPn0FwWA92JtP4NGKB1/DP7ei
QSsovkChh7ZBrCfpyR4sikopUgq9StFzM/UbZ5asSS4FfzAkO7vft5udiZMEnSBpk5dhFJmncjdHxXaG
A+9K4SbFT1luEwQBbXavVO5d0nI3ovnW5yeiMriiu+kt5asXbABEdgRigAUQDr+aHLU3lxoLl/yPJhvF
GsiYJ/vPdX5qPK3bVJ25VFukafztGQNsKHJ791I3w+8KcpNth8XDz5YxACI/gsR1J8sTYcO4UIzwv1gG
cTshgJ5IT8hChTMHsHi+v+fvffmxywVwN2FDkdsGEOK2ceu4feQ0tDqKyKMGqDfqjvprLzyswuX7Tf4E
dBo6zn/3OB7XHovRyuhQ6+hhYKA9DpL+A1keRebNAhkaJH0OHOcP031C4EjYr6wAAAAASUVORK5CYII=
</value>
</data>
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>186, 17</value>
</metadata>
<metadata name="ta.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>431, 17</value>
</metadata>
</root>

View File

@@ -1,474 +0,0 @@
namespace FCM0000
{
partial class fRequestItem_Add
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.Label pdateLabel;
System.Windows.Forms.Label tolistLabel;
System.Windows.Forms.Label cclistLabel;
System.Windows.Forms.Label bcclistLabel;
System.Windows.Forms.Label titleLabel;
System.Windows.Forms.Label remarkLabel;
System.Windows.Forms.Label label1;
System.Windows.Forms.Label label2;
System.Windows.Forms.Label label3;
System.Windows.Forms.Label label4;
System.Windows.Forms.Label label5;
System.Windows.Forms.Label label6;
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fRequestItem_Add));
this.dsMSSQL = new FCM0000.dsMSSQL();
this.bs = new System.Windows.Forms.BindingSource(this.components);
this.ta = new FCM0000.dsMSSQLTableAdapters.RequestItemTableAdapter();
this.tam = new FCM0000.dsMSSQLTableAdapters.TableAdapterManager();
this.tbItem = new System.Windows.Forms.TextBox();
this.btPDate = new System.Windows.Forms.DateTimePicker();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.lbTo = new System.Windows.Forms.Label();
this.lbCC = new System.Windows.Forms.Label();
this.lbBCC = new System.Windows.Forms.Label();
this.tbRemark = new YARTE.UI.HtmlEditor();
this.tbQty = new System.Windows.Forms.TextBox();
this.tbSID = new System.Windows.Forms.TextBox();
this.tbURL = new System.Windows.Forms.TextBox();
this.cmProject = new System.Windows.Forms.ComboBox();
this.btOK = new System.Windows.Forms.Button();
this.tbModel = new System.Windows.Forms.TextBox();
this.textBox1 = new System.Windows.Forms.TextBox();
pdateLabel = new System.Windows.Forms.Label();
tolistLabel = new System.Windows.Forms.Label();
cclistLabel = new System.Windows.Forms.Label();
bcclistLabel = new System.Windows.Forms.Label();
titleLabel = new System.Windows.Forms.Label();
remarkLabel = new System.Windows.Forms.Label();
label1 = new System.Windows.Forms.Label();
label2 = new System.Windows.Forms.Label();
label3 = new System.Windows.Forms.Label();
label4 = new System.Windows.Forms.Label();
label5 = new System.Windows.Forms.Label();
label6 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// pdateLabel
//
pdateLabel.AutoSize = true;
pdateLabel.Dock = System.Windows.Forms.DockStyle.Fill;
pdateLabel.Location = new System.Drawing.Point(5, 2);
pdateLabel.Name = "pdateLabel";
pdateLabel.Size = new System.Drawing.Size(248, 23);
pdateLabel.TabIndex = 4;
pdateLabel.Text = "등록일자";
pdateLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// tolistLabel
//
tolistLabel.AutoSize = true;
tolistLabel.Dock = System.Windows.Forms.DockStyle.Fill;
tolistLabel.Location = new System.Drawing.Point(5, 53);
tolistLabel.Name = "tolistLabel";
tolistLabel.Size = new System.Drawing.Size(248, 25);
tolistLabel.TabIndex = 6;
tolistLabel.Text = "To";
tolistLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// cclistLabel
//
cclistLabel.AutoSize = true;
cclistLabel.Dock = System.Windows.Forms.DockStyle.Fill;
cclistLabel.Location = new System.Drawing.Point(5, 131);
cclistLabel.Name = "cclistLabel";
cclistLabel.Size = new System.Drawing.Size(248, 20);
cclistLabel.TabIndex = 8;
cclistLabel.Text = "CC";
cclistLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// bcclistLabel
//
bcclistLabel.AutoSize = true;
bcclistLabel.Dock = System.Windows.Forms.DockStyle.Fill;
bcclistLabel.Location = new System.Drawing.Point(5, 204);
bcclistLabel.Name = "bcclistLabel";
bcclistLabel.Size = new System.Drawing.Size(248, 20);
bcclistLabel.TabIndex = 10;
bcclistLabel.Text = "BCC";
bcclistLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// titleLabel
//
titleLabel.AutoSize = true;
titleLabel.Location = new System.Drawing.Point(292, 14);
titleLabel.Name = "titleLabel";
titleLabel.Size = new System.Drawing.Size(29, 12);
titleLabel.TabIndex = 1;
titleLabel.Text = "Item";
titleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// remarkLabel
//
remarkLabel.AutoSize = true;
remarkLabel.Location = new System.Drawing.Point(266, 113);
remarkLabel.Name = "remarkLabel";
remarkLabel.Size = new System.Drawing.Size(55, 12);
remarkLabel.TabIndex = 13;
remarkLabel.Text = "Contents";
remarkLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
remarkLabel.Click += new System.EventHandler(this.remarkLabel_Click);
//
// label1
//
label1.AutoSize = true;
label1.Location = new System.Drawing.Point(493, 65);
label1.Name = "label1";
label1.Size = new System.Drawing.Size(24, 12);
label1.TabIndex = 7;
label1.Text = "Qty";
label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label2
//
label2.AutoSize = true;
label2.Location = new System.Drawing.Point(585, 65);
label2.Name = "label2";
label2.Size = new System.Drawing.Size(24, 12);
label2.TabIndex = 9;
label2.Text = "SID";
label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label3
//
label3.AutoSize = true;
label3.Location = new System.Drawing.Point(293, 91);
label3.Name = "label3";
label3.Size = new System.Drawing.Size(28, 12);
label3.TabIndex = 11;
label3.Text = "URL";
label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label4
//
label4.AutoSize = true;
label4.Location = new System.Drawing.Point(277, 40);
label4.Name = "label4";
label4.Size = new System.Drawing.Size(44, 12);
label4.TabIndex = 3;
label4.Text = "Project";
label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label5
//
label5.AutoSize = true;
label5.Location = new System.Drawing.Point(281, 65);
label5.Name = "label5";
label5.Size = new System.Drawing.Size(40, 12);
label5.TabIndex = 5;
label5.Text = "Model";
label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label6
//
label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
label6.AutoSize = true;
label6.Location = new System.Drawing.Point(282, 550);
label6.Name = "label6";
label6.Size = new System.Drawing.Size(41, 12);
label6.TabIndex = 30;
label6.Text = "Memo";
label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// dsMSSQL
//
this.dsMSSQL.DataSetName = "dsMSSQL";
this.dsMSSQL.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// bs
//
this.bs.DataMember = "RequestItem";
this.bs.DataSource = this.dsMSSQL;
//
// ta
//
this.ta.ClearBeforeFill = true;
//
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.CommonTableAdapter = null;
this.tam.CustomsTableAdapter = null;
this.tam.EETGW_DocuFormTableAdapter = null;
this.tam.HolidayLIstTableAdapter = null;
this.tam.InventoryUserTableAdapter = null;
this.tam.ItemsTableAdapter = null;
this.tam.ProjectsTableAdapter = null;
this.tam.PurchaseTableAdapter = null;
this.tam.RequestItemTableAdapter = this.ta;
this.tam.StaffTableAdapter = null;
this.tam.UpdateOrder = FCM0000.dsMSSQLTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
//
// tbItem
//
this.tbItem.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "title", true));
this.tbItem.Location = new System.Drawing.Point(329, 10);
this.tbItem.Name = "tbItem";
this.tbItem.Size = new System.Drawing.Size(401, 21);
this.tbItem.TabIndex = 2;
//
// btPDate
//
this.btPDate.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.bs, "pdate", true));
this.btPDate.Dock = System.Windows.Forms.DockStyle.Fill;
this.btPDate.Location = new System.Drawing.Point(2, 25);
this.btPDate.Margin = new System.Windows.Forms.Padding(0);
this.btPDate.Name = "btPDate";
this.btPDate.Size = new System.Drawing.Size(254, 21);
this.btPDate.TabIndex = 26;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 254F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.Controls.Add(pdateLabel, 0, 0);
this.tableLayoutPanel1.Controls.Add(tolistLabel, 0, 2);
this.tableLayoutPanel1.Controls.Add(bcclistLabel, 0, 6);
this.tableLayoutPanel1.Controls.Add(this.btPDate, 0, 1);
this.tableLayoutPanel1.Controls.Add(cclistLabel, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.lbTo, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.lbCC, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.lbBCC, 0, 7);
this.tableLayoutPanel1.Location = new System.Drawing.Point(5, 5);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel1.RowCount = 8;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.32999F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33001F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.34F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(258, 281);
this.tableLayoutPanel1.TabIndex = 0;
//
// lbTo
//
this.lbTo.AutoSize = true;
this.lbTo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.lbTo.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "tolist", true));
this.lbTo.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbTo.Location = new System.Drawing.Point(2, 78);
this.lbTo.Margin = new System.Windows.Forms.Padding(0);
this.lbTo.Name = "lbTo";
this.lbTo.Size = new System.Drawing.Size(254, 53);
this.lbTo.TabIndex = 30;
this.lbTo.Text = "--";
this.lbTo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lbCC
//
this.lbCC.AutoSize = true;
this.lbCC.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.lbCC.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "cclist", true));
this.lbCC.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbCC.Location = new System.Drawing.Point(2, 151);
this.lbCC.Margin = new System.Windows.Forms.Padding(0);
this.lbCC.Name = "lbCC";
this.lbCC.Size = new System.Drawing.Size(254, 53);
this.lbCC.TabIndex = 30;
this.lbCC.Text = "--";
this.lbCC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lbBCC
//
this.lbBCC.AutoSize = true;
this.lbBCC.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.lbBCC.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "bcclist", true));
this.lbBCC.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbBCC.Location = new System.Drawing.Point(2, 224);
this.lbBCC.Margin = new System.Windows.Forms.Padding(0);
this.lbBCC.Name = "lbBCC";
this.lbBCC.Size = new System.Drawing.Size(254, 55);
this.lbBCC.TabIndex = 30;
this.lbBCC.Text = "--";
this.lbBCC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// tbRemark
//
this.tbRemark.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbRemark.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.tbRemark.Html = resources.GetString("tbRemark.Html");
this.tbRemark.Location = new System.Drawing.Point(329, 113);
this.tbRemark.Margin = new System.Windows.Forms.Padding(0);
this.tbRemark.Name = "tbRemark";
this.tbRemark.ReadOnly = false;
this.tbRemark.ShowToolbar = true;
this.tbRemark.Size = new System.Drawing.Size(403, 427);
this.tbRemark.TabIndex = 14;
//
// tbQty
//
this.tbQty.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "qty", true));
this.tbQty.Location = new System.Drawing.Point(522, 61);
this.tbQty.Margin = new System.Windows.Forms.Padding(0);
this.tbQty.Name = "tbQty";
this.tbQty.Size = new System.Drawing.Size(58, 21);
this.tbQty.TabIndex = 8;
this.tbQty.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// tbSID
//
this.tbSID.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "sid", true));
this.tbSID.Location = new System.Drawing.Point(615, 61);
this.tbSID.Margin = new System.Windows.Forms.Padding(0);
this.tbSID.Name = "tbSID";
this.tbSID.Size = new System.Drawing.Size(115, 21);
this.tbSID.TabIndex = 10;
this.tbSID.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// tbURL
//
this.tbURL.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "url", true));
this.tbURL.Location = new System.Drawing.Point(329, 87);
this.tbURL.Margin = new System.Windows.Forms.Padding(0);
this.tbURL.Name = "tbURL";
this.tbURL.Size = new System.Drawing.Size(401, 21);
this.tbURL.TabIndex = 12;
//
// cmProject
//
this.cmProject.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.bs, "project", true));
this.cmProject.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmProject.FormattingEnabled = true;
this.cmProject.Location = new System.Drawing.Point(329, 36);
this.cmProject.Margin = new System.Windows.Forms.Padding(0);
this.cmProject.Name = "cmProject";
this.cmProject.Size = new System.Drawing.Size(401, 20);
this.cmProject.TabIndex = 4;
//
// btOK
//
this.btOK.Dock = System.Windows.Forms.DockStyle.Bottom;
this.btOK.Location = new System.Drawing.Point(5, 569);
this.btOK.Name = "btOK";
this.btOK.Size = new System.Drawing.Size(730, 33);
this.btOK.TabIndex = 29;
this.btOK.Text = "OK";
this.btOK.UseVisualStyleBackColor = true;
this.btOK.Click += new System.EventHandler(this.button1_Click);
//
// tbModel
//
this.tbModel.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "model", true));
this.tbModel.Location = new System.Drawing.Point(329, 61);
this.tbModel.Margin = new System.Windows.Forms.Padding(0);
this.tbModel.Name = "tbModel";
this.tbModel.Size = new System.Drawing.Size(161, 21);
this.tbModel.TabIndex = 6;
this.tbModel.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// textBox1
//
this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "memo", true));
this.textBox1.Location = new System.Drawing.Point(329, 545);
this.textBox1.Margin = new System.Windows.Forms.Padding(0);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(403, 21);
this.textBox1.TabIndex = 31;
//
// fRequestItem_Add
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(740, 607);
this.Controls.Add(this.textBox1);
this.Controls.Add(label6);
this.Controls.Add(label5);
this.Controls.Add(this.tbModel);
this.Controls.Add(this.tableLayoutPanel1);
this.Controls.Add(this.tbItem);
this.Controls.Add(this.btOK);
this.Controls.Add(titleLabel);
this.Controls.Add(label4);
this.Controls.Add(this.cmProject);
this.Controls.Add(label1);
this.Controls.Add(this.tbQty);
this.Controls.Add(this.tbRemark);
this.Controls.Add(remarkLabel);
this.Controls.Add(label2);
this.Controls.Add(this.tbSID);
this.Controls.Add(this.tbURL);
this.Controls.Add(label3);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "fRequestItem_Add";
this.Padding = new System.Windows.Forms.Padding(5);
this.Text = "fRequestItem_Add";
this.Load += new System.EventHandler(this.@__Load);
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private dsMSSQL dsMSSQL;
private System.Windows.Forms.BindingSource bs;
private dsMSSQLTableAdapters.RequestItemTableAdapter ta;
private dsMSSQLTableAdapters.TableAdapterManager tam;
public System.Windows.Forms.TextBox tbItem;
public System.Windows.Forms.DateTimePicker btPDate;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private YARTE.UI.HtmlEditor tbRemark;
private System.Windows.Forms.Button btOK;
private System.Windows.Forms.Label lbTo;
private System.Windows.Forms.Label lbCC;
private System.Windows.Forms.Label lbBCC;
public System.Windows.Forms.TextBox tbQty;
public System.Windows.Forms.TextBox tbSID;
private System.Windows.Forms.TextBox tbURL;
private System.Windows.Forms.ComboBox cmProject;
public System.Windows.Forms.TextBox tbModel;
private System.Windows.Forms.TextBox textBox1;
}
}

View File

@@ -1,104 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using YARTE.UI.Buttons;
namespace FCM0000
{
public partial class fRequestItem_Add : FCOMMON.fBase
{
dsMSSQL.RequestItemRow dr = null;
public fRequestItem_Add(dsMSSQL.RequestItemRow dr_)
{
InitializeComponent();
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
dr = dr_;
PredefinedButtonSets.SetupDefaultButtons(this.tbRemark);
}
private void __Load(object sender, EventArgs e)
{
EnsureVisibleAndUsableSize();
//프로젝트 리스트를 가져와서 cmb에 연결해준다.
var projectDT = FCOMMON.DBM.getProjectData();
this.cmProject.DataSource = projectDT;
this.cmProject.DisplayMember = "KeyValue";
this.cmProject.ValueMember = "Key";
this.bs.DataSource = this.dr;
if (this.dr.RowState == DataRowState.Detached)
{
//자로에서 불러와서 그 값을 가져온다.
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
var data = taMF.GetByCate(FCOMMON.info.Login.gcode, "BY");
if (data != null && data.Rows.Count > 0)
{
var drForm = data.Rows[0] as DSMail.MailFormRow;
this.tbItem.Text = drForm.title;
this.tbRemark.Html = drForm.body;
dr.tolist = drForm.tolist;
dr.bcclist = drForm.bcc;
dr.cclist = drForm.cc;
dr.EndEdit();
}
}
if (this.dr.RowState != DataRowState.Deleted)
{
lbBCC.Text = dr.bcclist;
lbCC.Text = dr.cclist;
lbTo.Text = dr.tolist;
tbRemark.Html = dr.remark;
}
}
private void requestItemBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.bs.EndEdit();
DialogResult = System.Windows.Forms.DialogResult.OK;
}
private void button1_Click(object sender, EventArgs e)
{
if (this.dr.cclist != lbCC.Text)
this.dr.cclist = lbCC.Text;
if (this.dr.tolist != lbTo.Text)
this.dr.tolist = lbTo.Text;
if (this.dr.bcclist != lbBCC.Text)
this.dr.bcclist = lbBCC.Text;
if (this.dr.remark != tbRemark.Html)
this.dr.remark = tbRemark.Html;
this.Invalidate();
this.bs.EndEdit();
DialogResult = System.Windows.Forms.DialogResult.OK;
}
private void remarkLabel_Click(object sender, EventArgs e)
{
var dlg = FCOMMON.Util.MsgQ("메일 형식을 초기화 하시겠습니까?");
if (dlg != System.Windows.Forms.DialogResult.Yes) return;
//자로에서 불러와서 그 값을 가져온다.
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
var data = taMF.GetByCate( FCOMMON.info.Login.gcode, "BY");
if (data != null && data.Rows.Count > 0)
{
var drForm = data.Rows[0] as DSMail.MailFormRow;
this.tbRemark.Html = drForm.body;
}
}
}
}

View File

@@ -1,176 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="pdateLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="tolistLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="cclistLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="bcclistLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="titleLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="remarkLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="label1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="label2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="label3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="label4.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="label5.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="label6.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>122, 17</value>
</metadata>
<metadata name="ta.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>186, 17</value>
</metadata>
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>248, 17</value>
</metadata>
<data name="tbRemark.Html" xml:space="preserve">
<value>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;
&lt;HTML&gt;&lt;HEAD&gt;
&lt;META content="text/html; charset=unicode" http-equiv=Content-Type&gt;
&lt;META name=GENERATOR content="MSHTML 11.00.10570.1001"&gt;&lt;/HEAD&gt;
&lt;BODY&gt;&lt;/BODY&gt;&lt;/HTML&gt;
</value>
</data>
</root>

View File

@@ -106,8 +106,8 @@ namespace FCM0000
//제목줄을 처리한다. 181029
List<string> cols = new List<string>();
string sDate = sd.Value.ToShortDateString();
string eDate = ed.Value.ToShortDateString();
string sDate = sd.Value.ToString("yyyy-MM-dd");
string eDate = ed.Value.ToString("yyyy-MM-dd");
for (int c = MinCol; c <= MaxCol; c++)
{

View File

@@ -127,12 +127,6 @@
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="Board\fPatchList.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Board\fPatchList.Designer.cs">
<DependentUpon>fPatchList.cs</DependentUpon>
</Compile>
<Compile Include="DSMail.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
@@ -191,30 +185,6 @@
<Compile Include="Mail\fJRForm.Designer.cs">
<DependentUpon>fJRForm.cs</DependentUpon>
</Compile>
<Compile Include="Mail\fMailList.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Mail\fMailList.Designer.cs">
<DependentUpon>fMailList.cs</DependentUpon>
</Compile>
<Compile Include="Mail\fSendMail.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Mail\fSendMail.Designer.cs">
<DependentUpon>fSendMail.cs</DependentUpon>
</Compile>
<Compile Include="Board\fRequestItem.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Board\fRequestItem.Designer.cs">
<DependentUpon>fRequestItem.cs</DependentUpon>
</Compile>
<Compile Include="Board\fRequestItem_Add.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Board\fRequestItem_Add.Designer.cs">
<DependentUpon>fRequestItem_Add.cs</DependentUpon>
</Compile>
<Compile Include="DSInventory.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
@@ -388,9 +358,6 @@
<Compile Include="MethodExtentions.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Board\fPatchList.resx">
<DependentUpon>fPatchList.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="fSIDListSelect.resx">
<DependentUpon>fSIDListSelect.cs</DependentUpon>
</EmbeddedResource>
@@ -409,18 +376,6 @@
<EmbeddedResource Include="Mail\fJRForm.resx">
<DependentUpon>fJRForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Mail\fMailList.resx">
<DependentUpon>fMailList.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Mail\fSendMail.resx">
<DependentUpon>fSendMail.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Board\fRequestItem.resx">
<DependentUpon>fRequestItem.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Board\fRequestItem_Add.resx">
<DependentUpon>fRequestItem_Add.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="fCode.resx">
<DependentUpon>fCode.cs</DependentUpon>
</EmbeddedResource>

View File

@@ -25,7 +25,7 @@ namespace FCM0000.Inventory
this.Show();
Application.DoEvents();
this.tbDate.Text = DateTime.Now.ToShortDateString();
this.tbDate.Text = DateTime.Now.ToString("yyyy-MM-dd");
this.reportViewer1.PageCountMode = Microsoft.Reporting.WinForms.PageCountMode.Actual;
this.reportViewer1.ZoomMode = Microsoft.Reporting.WinForms.ZoomMode.PageWidth;
refreshData();

View File

@@ -112,8 +112,8 @@ namespace FCM0000
}
cmbUser.SelectedIndex = 0;//전체
dtED.Text = DateTime.Now.ToShortDateString();
dtSD.Text = DateTime.Now.AddYears(-1).ToShortDateString();
dtED.Text = DateTime.Now.ToString("yyyy-MM-dd");
dtSD.Text = DateTime.Now.AddYears(-1).ToString("yyyy-MM-dd");
RefreshData();
}
@@ -159,7 +159,7 @@ namespace FCM0000
e.Row["wuid"] = FCOMMON.info.Login.no;
e.Row["uid"] = FCOMMON.info.Login.no;
e.Row["wdate"] = DateTime.Now;
e.Row["pdate"] = DateTime.Now.ToShortDateString();
e.Row["pdate"] = DateTime.Now.ToString("yyyy-MM-dd");
e.Row["cr_qty"] = 0;
e.Row["cr_amt"] = 0;
e.Row["dr_qty"] = 0;
@@ -436,7 +436,7 @@ namespace FCM0000
}
var newdr = this.dSInventory.vInventory.NewvInventoryRow();
newdr.pdate = DateTime.Now.ToShortDateString();
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
newdr.invtype = "입고";
newdr.item = dr.item;
//newdr.ItemArray = dr.ItemArray;
@@ -473,7 +473,7 @@ namespace FCM0000
}
var newdr = this.dSInventory.vInventory.NewvInventoryRow();
newdr.pdate = DateTime.Now.ToShortDateString();
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
newdr.invtype = "출고";
newdr.item = dr.item;
//newdr.ItemArray = dr.ItemArray;

View File

@@ -62,7 +62,7 @@ namespace FCM0000
updateplace();
dtSD.Text = DateTime.Now.ToShortDateString();
dtSD.Text = DateTime.Now.ToString("yyyy-MM-dd");
RefreshData();
}
@@ -233,7 +233,7 @@ namespace FCM0000
newdr.wuid = FCOMMON.info.Login.no;
newdr.uid = FCOMMON.info.Login.no;
newdr.wdate = DateTime.Now;
newdr.pdate = DateTime.Now.ToShortDateString();
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
newdr.cr_qty = 0;
newdr.cr_amt = 0;
newdr.dr_qty = 0;
@@ -278,7 +278,7 @@ namespace FCM0000
newdr.wuid = FCOMMON.info.Login.no;
newdr.uid = FCOMMON.info.Login.no;
newdr.wdate = DateTime.Now;
newdr.pdate = DateTime.Now.ToShortDateString();
newdr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
newdr.cr_qty = 0;
newdr.cr_amt = 0;
newdr.dr_qty = 0;

View File

@@ -70,7 +70,7 @@ namespace FCM0000.Inventory
FCOMMON.Util.MsgE("품목을 먼저 선택하세요");
return;
}
this.ta.FillByItemIdx(this.dSReport.jagosummaryPlace, FCOMMON.info.Login.gcode, DateTime.Now.ToShortDateString(), itmidx);
this.ta.FillByItemIdx(this.dSReport.jagosummaryPlace, FCOMMON.info.Login.gcode, DateTime.Now.ToString("yyyy-MM-dd"), itmidx);
}

View File

@@ -361,7 +361,6 @@
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.CommonTableAdapter = null;
this.tam.CustomsTableAdapter = null;
this.tam.HolidayLIstTableAdapter = null;

View File

@@ -75,10 +75,10 @@ namespace FCM0000
//마지막 자료를 가져온날을 찾는다.
var dateList = FCOMMON.DBM.getDateList("InventoryUser", "uid='" + FCOMMON.info.Login.no + "'");
dtED.Text = DateTime.Now.ToShortDateString();
dtED.Text = DateTime.Now.ToString("yyyy-MM-dd");
if (dateList.Count > 0) dtSD.Text = dateList[dateList.Count - 1];
else dtSD.Text = DateTime.Now.AddDays(-7).ToShortDateString();
else dtSD.Text = DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd");
btSearch.PerformClick();
@@ -126,7 +126,7 @@ namespace FCM0000
e.Row["wuid"] = FCOMMON.info.Login.no;
e.Row["uid"] = FCOMMON.info.Login.no;
e.Row["wdate"] = DateTime.Now;
e.Row["pdate"] = DateTime.Now.ToShortDateString();
e.Row["pdate"] = DateTime.Now.ToString("yyyy-MM-dd");
e.Row["dr_qty"] = 0;
e.Row["dr_amt"] = 0;
e.Row["invtype"] = "I1";

View File

@@ -79,7 +79,7 @@ namespace FCM0000
///입력된 데이터를 적용한다.
if (dr.pdate == "") dr.pdate = DateTime.Now.ToShortDateString();
if (dr.pdate == "") dr.pdate = DateTime.Now.ToString("yyyy-MM-dd");
dtPdate.Value = DateTime.Parse(dr.pdate);
dtPdate.Value = DateTime.Parse(dr.pdate);
// cmbRequest.Text = dr.userName;
@@ -265,7 +265,7 @@ namespace FCM0000
if (tbPumIDX.Text == "" || tbPumIDX.Text == "-1") dr.SetitemNull();
else dr.item = int.Parse(tbPumIDX.Text);
dr.sid = tbSID.Text.Trim();
dr.pdate = this.dtPdate.Value.ToShortDateString();
dr.pdate = this.dtPdate.Value.ToString("yyyy-MM-dd");
dr.gcode = FCOMMON.info.Login.gcode;
if (cmbRequest.Text.IndexOf("]") != -1)
{

View File

@@ -379,7 +379,6 @@
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.CommonTableAdapter = null;
this.tam.CustomsTableAdapter = null;
this.tam.EETGW_DocuFormTableAdapter = null;

View File

@@ -451,7 +451,6 @@
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.CommonTableAdapter = null;
this.tam.CustomsTableAdapter = null;
this.tam.EETGW_DocuFormTableAdapter = null;

View File

@@ -152,8 +152,8 @@ namespace FCM0000
this.dr.fromlist = tbFrom.Text.Trim();
this.dr.enable = chkEnb.Checked;
this.dr.sdate = dtSd.Value.ToShortDateString();
this.dr.edate = dtEd.Value.ToShortDateString();
this.dr.sdate = dtSd.Value.ToString("yyyy-MM-dd");
this.dr.edate = dtEd.Value.ToString("yyyy-MM-dd");
this.dr.stime = string.Format("{0}:{1}",cmbHour.Text,cmbMinute.Text);
this.dr.tolist = tbTo.Text.Trim();
this.dr.bcc = tbBcc.Text.Trim();

View File

@@ -1,525 +0,0 @@
namespace FCM0000.Mail
{
partial class fMailList
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fMailList));
this.bn = new System.Windows.Forms.BindingNavigator(this.components);
this.btAdd = new System.Windows.Forms.ToolStripButton();
this.bs = new System.Windows.Forms.BindingSource(this.components);
this.dSMail = new FCM0000.DSMail();
this.bindingNavigatorCountItem = new System.Windows.Forms.ToolStripLabel();
this.btDel = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMoveFirstItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMovePreviousItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorSeparator = new System.Windows.Forms.ToolStripSeparator();
this.bindingNavigatorPositionItem = new System.Windows.Forms.ToolStripTextBox();
this.bindingNavigatorSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.bindingNavigatorMoveNextItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorMoveLastItem = new System.Windows.Forms.ToolStripButton();
this.bindingNavigatorSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.btSave = new System.Windows.Forms.ToolStripButton();
this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
this.tbFind = new System.Windows.Forms.ToolStripTextBox();
this.toolStripButton2 = new System.Windows.Forms.ToolStripButton();
this.panel1 = new System.Windows.Forms.Panel();
this.button1 = new System.Windows.Forms.Button();
this.btRefresh = new System.Windows.Forms.Button();
this.dtEd = new System.Windows.Forms.DateTimePicker();
this.label2 = new System.Windows.Forms.Label();
this.dtSd = new System.Windows.Forms.DateTimePicker();
this.label1 = new System.Windows.Forms.Label();
this.arDatagridView1 = new arCtl.arDatagridView();
this.tam = new FCM0000.DSMailTableAdapters.TableAdapterManager();
this.pdateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.subjectDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.fromlistDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.tolistDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ccDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.wuidDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.wdateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.sendOKDataGridViewCheckBoxColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn();
this.suid = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.sdate = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.cateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.SendMsg2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)(this.bn)).BeginInit();
this.bn.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dSMail)).BeginInit();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.arDatagridView1)).BeginInit();
this.SuspendLayout();
//
// bn
//
this.bn.AddNewItem = this.btAdd;
this.bn.BindingSource = this.bs;
this.bn.CountItem = this.bindingNavigatorCountItem;
this.bn.DeleteItem = this.btDel;
this.bn.Dock = System.Windows.Forms.DockStyle.Bottom;
this.bn.ImageScalingSize = new System.Drawing.Size(32, 32);
this.bn.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.bindingNavigatorMoveFirstItem,
this.bindingNavigatorMovePreviousItem,
this.bindingNavigatorSeparator,
this.bindingNavigatorPositionItem,
this.bindingNavigatorCountItem,
this.bindingNavigatorSeparator1,
this.bindingNavigatorMoveNextItem,
this.bindingNavigatorMoveLastItem,
this.bindingNavigatorSeparator2,
this.btAdd,
this.btDel,
this.btSave,
this.toolStripButton1,
this.toolStripSeparator1,
this.toolStripLabel1,
this.tbFind,
this.toolStripButton2});
this.bn.Location = new System.Drawing.Point(0, 514);
this.bn.MoveFirstItem = this.bindingNavigatorMoveFirstItem;
this.bn.MoveLastItem = this.bindingNavigatorMoveLastItem;
this.bn.MoveNextItem = this.bindingNavigatorMoveNextItem;
this.bn.MovePreviousItem = this.bindingNavigatorMovePreviousItem;
this.bn.Name = "bn";
this.bn.PositionItem = this.bindingNavigatorPositionItem;
this.bn.Size = new System.Drawing.Size(855, 39);
this.bn.TabIndex = 0;
this.bn.Text = "bindingNavigator1";
//
// btAdd
//
this.btAdd.Image = ((System.Drawing.Image)(resources.GetObject("btAdd.Image")));
this.btAdd.Name = "btAdd";
this.btAdd.RightToLeftAutoMirrorImage = true;
this.btAdd.Size = new System.Drawing.Size(79, 36);
this.btAdd.Text = "테스트";
this.btAdd.Click += new System.EventHandler(this.btAdd_Click);
//
// bs
//
this.bs.DataMember = "MailData";
this.bs.DataSource = this.dSMail;
this.bs.Sort = "wdate desc,pdate";
//
// dSMail
//
this.dSMail.DataSetName = "DSMail";
this.dSMail.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// bindingNavigatorCountItem
//
this.bindingNavigatorCountItem.Name = "bindingNavigatorCountItem";
this.bindingNavigatorCountItem.Size = new System.Drawing.Size(27, 36);
this.bindingNavigatorCountItem.Text = "/{0}";
this.bindingNavigatorCountItem.ToolTipText = "전체 항목 수";
//
// btDel
//
this.btDel.Enabled = false;
this.btDel.Image = ((System.Drawing.Image)(resources.GetObject("btDel.Image")));
this.btDel.Name = "btDel";
this.btDel.RightToLeftAutoMirrorImage = true;
this.btDel.Size = new System.Drawing.Size(67, 36);
this.btDel.Text = "삭제";
//
// bindingNavigatorMoveFirstItem
//
this.bindingNavigatorMoveFirstItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMoveFirstItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveFirstItem.Image")));
this.bindingNavigatorMoveFirstItem.Name = "bindingNavigatorMoveFirstItem";
this.bindingNavigatorMoveFirstItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMoveFirstItem.Size = new System.Drawing.Size(36, 36);
this.bindingNavigatorMoveFirstItem.Text = "처음으로 이동";
//
// bindingNavigatorMovePreviousItem
//
this.bindingNavigatorMovePreviousItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMovePreviousItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMovePreviousItem.Image")));
this.bindingNavigatorMovePreviousItem.Name = "bindingNavigatorMovePreviousItem";
this.bindingNavigatorMovePreviousItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMovePreviousItem.Size = new System.Drawing.Size(36, 36);
this.bindingNavigatorMovePreviousItem.Text = "이전으로 이동";
//
// bindingNavigatorSeparator
//
this.bindingNavigatorSeparator.Name = "bindingNavigatorSeparator";
this.bindingNavigatorSeparator.Size = new System.Drawing.Size(6, 39);
//
// bindingNavigatorPositionItem
//
this.bindingNavigatorPositionItem.AccessibleName = "위치";
this.bindingNavigatorPositionItem.AutoSize = false;
this.bindingNavigatorPositionItem.Font = new System.Drawing.Font("맑은 고딕", 9F);
this.bindingNavigatorPositionItem.Name = "bindingNavigatorPositionItem";
this.bindingNavigatorPositionItem.Size = new System.Drawing.Size(50, 23);
this.bindingNavigatorPositionItem.Text = "0";
this.bindingNavigatorPositionItem.ToolTipText = "현재 위치";
//
// bindingNavigatorSeparator1
//
this.bindingNavigatorSeparator1.Name = "bindingNavigatorSeparator1";
this.bindingNavigatorSeparator1.Size = new System.Drawing.Size(6, 39);
//
// bindingNavigatorMoveNextItem
//
this.bindingNavigatorMoveNextItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMoveNextItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveNextItem.Image")));
this.bindingNavigatorMoveNextItem.Name = "bindingNavigatorMoveNextItem";
this.bindingNavigatorMoveNextItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMoveNextItem.Size = new System.Drawing.Size(36, 36);
this.bindingNavigatorMoveNextItem.Text = "다음으로 이동";
//
// bindingNavigatorMoveLastItem
//
this.bindingNavigatorMoveLastItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.bindingNavigatorMoveLastItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveLastItem.Image")));
this.bindingNavigatorMoveLastItem.Name = "bindingNavigatorMoveLastItem";
this.bindingNavigatorMoveLastItem.RightToLeftAutoMirrorImage = true;
this.bindingNavigatorMoveLastItem.Size = new System.Drawing.Size(36, 36);
this.bindingNavigatorMoveLastItem.Text = "마지막으로 이동";
//
// bindingNavigatorSeparator2
//
this.bindingNavigatorSeparator2.Name = "bindingNavigatorSeparator2";
this.bindingNavigatorSeparator2.Size = new System.Drawing.Size(6, 39);
//
// btSave
//
this.btSave.Enabled = false;
this.btSave.Image = ((System.Drawing.Image)(resources.GetObject("btSave.Image")));
this.btSave.Name = "btSave";
this.btSave.Size = new System.Drawing.Size(67, 36);
this.btSave.Text = "저장";
this.btSave.Click += new System.EventHandler(this.mailDataBindingNavigatorSaveItem_Click);
//
// toolStripButton1
//
this.toolStripButton1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));
this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButton1.Name = "toolStripButton1";
this.toolStripButton1.Size = new System.Drawing.Size(119, 36);
this.toolStripButton1.Text = "목록 내보내기";
this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 39);
//
// toolStripLabel1
//
this.toolStripLabel1.Name = "toolStripLabel1";
this.toolStripLabel1.Size = new System.Drawing.Size(31, 36);
this.toolStripLabel1.Text = "검색";
//
// tbFind
//
this.tbFind.Font = new System.Drawing.Font("맑은 고딕", 9F);
this.tbFind.Name = "tbFind";
this.tbFind.Size = new System.Drawing.Size(120, 39);
this.tbFind.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbFind_KeyDown_1);
//
// toolStripButton2
//
this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image")));
this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButton2.Name = "toolStripButton2";
this.toolStripButton2.Size = new System.Drawing.Size(36, 36);
this.toolStripButton2.Text = "toolStripButton2";
this.toolStripButton2.Click += new System.EventHandler(this.toolStripButton2_Click);
//
// panel1
//
this.panel1.Controls.Add(this.button1);
this.panel1.Controls.Add(this.btRefresh);
this.panel1.Controls.Add(this.dtEd);
this.panel1.Controls.Add(this.label2);
this.panel1.Controls.Add(this.dtSd);
this.panel1.Controls.Add(this.label1);
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(855, 36);
this.panel1.TabIndex = 3;
//
// button1
//
this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.button1.Location = new System.Drawing.Point(785, 7);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(64, 21);
this.button1.TabIndex = 5;
this.button1.Text = "닫기";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// btRefresh
//
this.btRefresh.Location = new System.Drawing.Point(482, 9);
this.btRefresh.Name = "btRefresh";
this.btRefresh.Size = new System.Drawing.Size(64, 21);
this.btRefresh.TabIndex = 4;
this.btRefresh.Text = "조회";
this.btRefresh.UseVisualStyleBackColor = true;
this.btRefresh.Click += new System.EventHandler(this.btRefresh_Click);
//
// dtEd
//
this.dtEd.Location = new System.Drawing.Point(273, 9);
this.dtEd.Name = "dtEd";
this.dtEd.Size = new System.Drawing.Size(200, 21);
this.dtEd.TabIndex = 3;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(253, 13);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(14, 12);
this.label2.TabIndex = 2;
this.label2.Text = "~";
//
// dtSd
//
this.dtSd.Location = new System.Drawing.Point(45, 7);
this.dtSd.Name = "dtSd";
this.dtSd.Size = new System.Drawing.Size(200, 21);
this.dtSd.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(10, 12);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(29, 12);
this.label1.TabIndex = 0;
this.label1.Text = "기간";
//
// arDatagridView1
//
this.arDatagridView1.A_DelCurrentCell = true;
this.arDatagridView1.A_EnterToTab = true;
this.arDatagridView1.A_KoreanField = null;
this.arDatagridView1.A_UpperField = null;
this.arDatagridView1.A_ViewRownumOnHeader = true;
this.arDatagridView1.AllowUserToAddRows = false;
this.arDatagridView1.AllowUserToDeleteRows = false;
this.arDatagridView1.AutoGenerateColumns = false;
this.arDatagridView1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.arDatagridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.arDatagridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.pdateDataGridViewTextBoxColumn,
this.subjectDataGridViewTextBoxColumn,
this.fromlistDataGridViewTextBoxColumn,
this.tolistDataGridViewTextBoxColumn,
this.ccDataGridViewTextBoxColumn,
this.wuidDataGridViewTextBoxColumn,
this.wdateDataGridViewTextBoxColumn,
this.sendOKDataGridViewCheckBoxColumn,
this.suid,
this.sdate,
this.cateDataGridViewTextBoxColumn,
this.SendMsg2});
this.arDatagridView1.DataSource = this.bs;
this.arDatagridView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.arDatagridView1.Location = new System.Drawing.Point(0, 36);
this.arDatagridView1.Name = "arDatagridView1";
this.arDatagridView1.ReadOnly = true;
this.arDatagridView1.RowTemplate.Height = 23;
this.arDatagridView1.Size = new System.Drawing.Size(855, 478);
this.arDatagridView1.TabIndex = 4;
//
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.Connection = null;
this.tam.MailAutoTableAdapter = null;
this.tam.MailDataTableAdapter = null;
this.tam.MailFormTableAdapter = null;
this.tam.UpdateOrder = FCM0000.DSMailTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
//
// pdateDataGridViewTextBoxColumn
//
this.pdateDataGridViewTextBoxColumn.DataPropertyName = "pdate";
this.pdateDataGridViewTextBoxColumn.HeaderText = "등록일";
this.pdateDataGridViewTextBoxColumn.Name = "pdateDataGridViewTextBoxColumn";
this.pdateDataGridViewTextBoxColumn.ReadOnly = true;
//
// subjectDataGridViewTextBoxColumn
//
this.subjectDataGridViewTextBoxColumn.DataPropertyName = "subject";
this.subjectDataGridViewTextBoxColumn.HeaderText = "제목";
this.subjectDataGridViewTextBoxColumn.Name = "subjectDataGridViewTextBoxColumn";
this.subjectDataGridViewTextBoxColumn.ReadOnly = true;
//
// fromlistDataGridViewTextBoxColumn
//
this.fromlistDataGridViewTextBoxColumn.DataPropertyName = "fromlist";
this.fromlistDataGridViewTextBoxColumn.HeaderText = "From";
this.fromlistDataGridViewTextBoxColumn.Name = "fromlistDataGridViewTextBoxColumn";
this.fromlistDataGridViewTextBoxColumn.ReadOnly = true;
//
// tolistDataGridViewTextBoxColumn
//
this.tolistDataGridViewTextBoxColumn.DataPropertyName = "tolist";
this.tolistDataGridViewTextBoxColumn.HeaderText = "To";
this.tolistDataGridViewTextBoxColumn.Name = "tolistDataGridViewTextBoxColumn";
this.tolistDataGridViewTextBoxColumn.ReadOnly = true;
//
// ccDataGridViewTextBoxColumn
//
this.ccDataGridViewTextBoxColumn.DataPropertyName = "cc";
this.ccDataGridViewTextBoxColumn.HeaderText = "CC";
this.ccDataGridViewTextBoxColumn.Name = "ccDataGridViewTextBoxColumn";
this.ccDataGridViewTextBoxColumn.ReadOnly = true;
//
// wuidDataGridViewTextBoxColumn
//
this.wuidDataGridViewTextBoxColumn.DataPropertyName = "wuid";
this.wuidDataGridViewTextBoxColumn.HeaderText = "작성자";
this.wuidDataGridViewTextBoxColumn.Name = "wuidDataGridViewTextBoxColumn";
this.wuidDataGridViewTextBoxColumn.ReadOnly = true;
//
// wdateDataGridViewTextBoxColumn
//
this.wdateDataGridViewTextBoxColumn.DataPropertyName = "wdate";
this.wdateDataGridViewTextBoxColumn.HeaderText = "작성일";
this.wdateDataGridViewTextBoxColumn.Name = "wdateDataGridViewTextBoxColumn";
this.wdateDataGridViewTextBoxColumn.ReadOnly = true;
//
// sendOKDataGridViewCheckBoxColumn
//
this.sendOKDataGridViewCheckBoxColumn.DataPropertyName = "SendOK2";
this.sendOKDataGridViewCheckBoxColumn.HeaderText = "전송";
this.sendOKDataGridViewCheckBoxColumn.Name = "sendOKDataGridViewCheckBoxColumn";
this.sendOKDataGridViewCheckBoxColumn.ReadOnly = true;
//
// suid
//
this.suid.DataPropertyName = "suid2";
this.suid.HeaderText = "전송자";
this.suid.Name = "suid";
this.suid.ReadOnly = true;
//
// sdate
//
this.sdate.DataPropertyName = "sdate2";
this.sdate.HeaderText = "전송시간";
this.sdate.Name = "sdate";
this.sdate.ReadOnly = true;
//
// cateDataGridViewTextBoxColumn
//
this.cateDataGridViewTextBoxColumn.DataPropertyName = "cate";
this.cateDataGridViewTextBoxColumn.HeaderText = "분류";
this.cateDataGridViewTextBoxColumn.Name = "cateDataGridViewTextBoxColumn";
this.cateDataGridViewTextBoxColumn.ReadOnly = true;
//
// SendMsg2
//
this.SendMsg2.DataPropertyName = "SendMsg2";
this.SendMsg2.HeaderText = "Message";
this.SendMsg2.Name = "SendMsg2";
this.SendMsg2.ReadOnly = true;
//
// fMailList
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(855, 553);
this.Controls.Add(this.arDatagridView1);
this.Controls.Add(this.panel1);
this.Controls.Add(this.bn);
this.Name = "fMailList";
this.Text = "메일 발신 내역";
this.Load += new System.EventHandler(this.@__Load);
((System.ComponentModel.ISupportInitialize)(this.bn)).EndInit();
this.bn.ResumeLayout(false);
this.bn.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dSMail)).EndInit();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.arDatagridView1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private DSMail dSMail;
private System.Windows.Forms.BindingSource bs;
private DSMailTableAdapters.TableAdapterManager tam;
private System.Windows.Forms.BindingNavigator bn;
private System.Windows.Forms.ToolStripButton btAdd;
private System.Windows.Forms.ToolStripLabel bindingNavigatorCountItem;
private System.Windows.Forms.ToolStripButton btDel;
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveFirstItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorMovePreviousItem;
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator;
private System.Windows.Forms.ToolStripTextBox bindingNavigatorPositionItem;
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator1;
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveNextItem;
private System.Windows.Forms.ToolStripButton bindingNavigatorMoveLastItem;
private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator2;
private System.Windows.Forms.ToolStripButton btSave;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.DateTimePicker dtEd;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.DateTimePicker dtSd;
private System.Windows.Forms.Button btRefresh;
private System.Windows.Forms.Button button1;
private arCtl.arDatagridView arDatagridView1;
private System.Windows.Forms.ToolStripButton toolStripButton1;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripLabel toolStripLabel1;
private System.Windows.Forms.ToolStripTextBox tbFind;
private System.Windows.Forms.ToolStripButton toolStripButton2;
private System.Windows.Forms.DataGridViewTextBoxColumn pdateDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn subjectDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn fromlistDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn tolistDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn ccDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn wuidDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn wdateDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewCheckBoxColumn sendOKDataGridViewCheckBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn suid;
private System.Windows.Forms.DataGridViewTextBoxColumn sdate;
private System.Windows.Forms.DataGridViewTextBoxColumn cateDataGridViewTextBoxColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn SendMsg2;
}
}

View File

@@ -1,147 +0,0 @@
using FCOMMON;
using NetOffice.OutlookApi;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FCM0000.Mail
{
public partial class fMailList : fBase
{
string fn_fpcolsize = "";
public fMailList()
{
InitializeComponent();
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
this.FormClosed += fAutoSendSetting_FormClosed;
fn_fpcolsize = System.IO.Path.Combine(FCOMMON.Util.CurrentPath, "formSetting", "fp_" + this.Name + ".ini");
}
void fAutoSendSetting_FormClosed(object sender, FormClosedEventArgs e)
{
//FCOMMON.Util.FPColsizeSave(this.fpSpread1, fn_fpcolsize);
}
private void mailDataBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.bs.EndEdit();
this.tam.UpdateAll(this.dSMail);
}
private void __Load(object sender, EventArgs e)
{
EnsureVisibleAndUsableSize();
this.dtEd.Value = DateTime.Now;
this.dtSd.Value = DateTime.Now.AddDays(-10);
refreshData();
}
private void fillToolStripButton_Click(object sender, EventArgs e)
{
}
void refreshData()
{
try
{
var ta = new DSMailTableAdapters.MailDataTableAdapter();
ta.Fill(this.dSMail.MailData, FCOMMON.info.Login.gcode, dtSd.Value.ToShortDateString(), dtEd.Value.ToShortDateString(), "%");
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
this.arDatagridView1.AutoResizeColumns();
// FCOMMON.Util.FPColSizeLoad(ref this.fpSpread1, fn_fpcolsize);
}
private void btRefresh_Click(object sender, EventArgs e)
{
refreshData();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
private void btFind_Click(object sender, EventArgs e)
{
}
void find()
{
var txt = tbFind.Text.Trim();
if (txt.isEmpty())
{
bs.Filter = "";
tbFind.BackColor = Color.White;
}
else
{
var cols = new string[] { "subject", "fromlist", "tolist", "cate" };
var where = string.Join(" like @ or ", cols) + " like @";
where = where.Replace("@", $"'%{txt.Replace("'", "''")}%'");
try
{
bs.Filter = where;
tbFind.BackColor = Color.Lime;
}
catch
{
bs.Filter = "";
tbFind.BackColor = Color.HotPink;
}
}
tbFind.SelectAll();
tbFind.Focus();
}
private void tbFind_KeyDown(object sender, KeyEventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
var fn = "export_mail_data.csv";
using (var sd = new SaveFileDialog() { FileName = fn, RestoreDirectory = true })
{
if (sd.ShowDialog() != DialogResult.OK) return;
arDatagridView1.ExportData(sd.FileName);
var dlg = Util.MsgQ("생성된 파일을 확인 할까요?");
if (dlg == DialogResult.Yes) Util.RunExplorer(sd.FileName);
}
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
find();
}
private void tbFind_KeyDown_1(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) find();
}
private void btAdd_Click(object sender, EventArgs e)
{
using (var f = new fSendMail())
f.ShowDialog();
}
}
}

View File

@@ -1,250 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="bn.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>245, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btAdd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vQAADr0BR/uQrQAAAUpJREFUOE9jGLzg7gL2/7fmcf6/Oofr/8UZvP+hwsSD60CNfx41/v/zsOH/yckC
pBtwfjov3ICDPSKkG3B8kiBQc93/Pw+q/u9oFydswKWZPP/PTuX7fxKo8Ui/0P993SJAzeX//94r+r++
Qeb/qhq5/0srFf/PL1X+P6tIFdPAU0B//nlYD9RUC8SV///cKwHivP9/72b+/3sn+f/f23H//92MAOKQ
/5NyNDENONQrDHbu3/ulQI0FQI3ZQI2pQI0J///digZqDPv/70bQ/3/X/f53peliGrCzXeL/lmap/+vA
zpX/v6RC8f/fWzFAjeH/p+Zp/J+QpfW/O0P3f3uq/v/mREPCYTIb6E+Qc//dCPjfk6FDWAM6APnz3w1/
IPb735qsT7oB3em6YP+CcH2cEekGtCQZ/G+IN/xfE2v8vzLahHQD6AQYGAAkI9iedfyIaQAAAABJRU5E
rkJggg==
</value>
</data>
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>179, 17</value>
</metadata>
<metadata name="dSMail.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>90, 17</value>
</metadata>
<data name="btDel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vQAADr0BR/uQrQAAAW9JREFUOE+1kE0ow2Ecx3dV3krt4oJaOSCTvIRkMqSxyITIzCQHDouEdnFwIOVC
DrhIDiQl5UTiNG/z2ppafy1S2gX/uDwfY6i1v7Hie3nqeb7fz+/7/FR/Ilwn0G0Exw4fV5GJlXlEZxXC
rIet9bAQvB5Ymgn2sLYAvSZEux7RUQFzE4qQt4bCXAYjPaHvnDoCkLpsRGMB2JqCTGLIijDlwqQ9bEMV
i9OIytR3EMNWcJ/BWH8A6j8/bOGFxwXNxYEvGbMQ9XnQ1/K78KfY3/VXzkMY0qFGG2H4RoLGQshJQNbG
86CNhdrsX9a/uQZTPhQl4rMY4OLofbl3aX7I8uwPC7y/g1YdjyVJuEvT8e1tfwUYteHUxCCfHChDeHmG
QQvokjlOU+PbWA0x3pZnILVVI3uvQyHsbiLnqnGmRCF1NYD8pDhpRxOH7HQoAKZGkFKjceszQbpSrumX
bO+G80MFwKUTxgfgcO/b8D9IpXoFiiMDHIQm0skAAAAASUVORK5CYII=
</value>
</data>
<data name="bindingNavigatorMoveFirstItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vQAADr0BR/uQrQAAASpJREFUOE9jGDygcNbz/00Lnv/PnPj4P1QIA4S3P8Apx5A789n/VUfe/8elKL77
wf/ghmu4DciY8vT/wn0fsCqK73n4f+n+///9qy/gNiCh58n/aVveYyiKaL8P1pw56/9/r9ITuA2I7Hr0
v3f1BxRFoa33wJpb1wFt7/z73yX/AG4DApsf/q+b/w6uKLjl7v9Fe///7wBqzpjz879d3c//9hnbcRvg
UXX/f/60NyiK7Ipv/0+f8/u/f9e3/zqF7/5bJKzHbYB96d3/2ZNfYyjSTzn/36ToxX+VrE//jSOX4TbA
Iu/O/9T+11gVGSSd+C+b9vW/bvA83AYYZt3+H9byEqci/dTL/zV8p+E2QCftxn+/6od4Fal4TMBtgFPu
lf8gBXgVDULAwAAA8HbAq6XlmnAAAAAASUVORK5CYII=
</value>
</data>
<data name="bindingNavigatorMovePreviousItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vQAADr0BR/uQrQAAALZJREFUOE9jGDogvP3BfyiTdBDf/eB/cMM18gyI73n4f+n+///9qy+QbkBE+32w
5sxZ//97lZ4gzYDQ1ntgza3rgLZ3/v3vkn+AeAOCW+7+X7T3//8OoOaMOT//29X9/G+fsZ00F9gV3/6f
Puf3f/+ub/91Ct/9t0hYT3oY6Kec/29S9OK/Stan/8aRy0g3AAQMkk78l037+l83eB55BoCAfurl/xq+
08g3AARUPCZQZsBgBQwMANAUYJgEulBVAAAAAElFTkSuQmCC
</value>
</data>
<data name="bindingNavigatorMoveNextItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vQAADr0BR/uQrQAAAKNJREFUOE9jGHygcNbz/1AmeSB35rP/Cd33yDckY8rT//P2//6f0HWHPEMSep78
n73v1//OrX//u5VeJt2QyK5H/6ds+/W/ZOnf/wnT//63yT1LmiGBzQ//t659D9ZsXPLlv3T0tf/GkcuI
N8Sj6v7/krnv4JoVXXpIc4F96d3/gS3PyNMMAhZ5d/7bFFwhTzMIGGbdJl8zCOik3SBf81AEDAwAoH5f
oAc0QjgAAAAASUVORK5CYII=
</value>
</data>
<data name="bindingNavigatorMoveLastItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vQAADr0BR/uQrQAAASxJREFUOE9jGFygcNbz/1AmBgDJNS14/j9z4mOcahhyZz77n9B9D6sCkNyqI+//
h7c/wG1AxpSn/+ft//0/oesOhiKQ3MJ9H/4HN1zDbUBCz5P/s/f9+t+59e9/t9LLKApBctO2vP/vX30B
twGRXY/+T9n263/J0r//E6b//W+TexauGCTXu/rDf6/SE7gNCGx++L917XuwZuOSL/+lo6/9N45cBtYA
kqub/+6/S/4B3AZ4VN3/XzL3HVyzoksPXDFILn/am//2GdtxG2Bfevd/YMszDM0gAJLLnvz6v0XCetwG
WOTd+W9TcAVDMwiA5FL7X8O9hBUYZt3GqhkEQHJhLS//6wbPw22ATtoNnJIgOb/qh/81fKfhNgAfcMq9
8l/FYwIYQ4UGBWBgAAC+0b+zuQxOnAAAAABJRU5ErkJggg==
</value>
</data>
<data name="btSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vQAADr0BR/uQrQAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
</value>
</data>
<data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIESURBVFhH7ZXLK0RxFMfnD7GQlY2dmMkMTVnIu6QsyCsb
pZTyTLaKGY0xxivlubCY8SwWFEqR8S6xkdyRVyhGKI75HXdu5vqpyT0/G/c7fere0+/c87m3+7tj0CMq
pnZTbKItqY6EjpRo+bJ0MdnM+Ua7GbRi6bRCYrv5NN5ujpEvTRMqQe/BFKT3ZNFLUgluSJvg8/voJSkF
LwKX9JLUguSSIgRJJUUJkkmKFPwqaWxLOklwpETJYyMPlWDv2gB49rxcOpYdYLJbgM2Sx0YeKsFI0AW1
ogtq5f8KNs+1gGvVjaS5M5R6tadGqecPFoT18BAm2DjbDKEMrQ9jzepMhdvALdb89+dgcVi/9akRJsjY
lnZQ5un1CZ+ic8WF5yzsBng9aoQKFo+Wwdv7GwqNbo7D9eMNHu+f7+O/BK9HjVBBxvzhAkqF8h78lY1X
cNfyEC6Y05+nPEWWxaMl7rqfEC7YMNMkq31GuvdHtDlCCBVkItKdhGKh94/FueziruchVLBrpVtWAqid
qgff2RYeB14CkNGbze1RI0wwzZ0JD8+PKHR8dYy7tnKiCs9ZPLtebp8aYYLe3UlZBaBuulGpb51tY41t
nMLh4rAeHsIEi0ZKoWSsHPn6zUvvyVbqmX25YT08hAlSoQtqRRfUii6olV8JGm3JccHm1j8hOEseq4c4
BsMH9in5LvAGb8kAAAAASUVORK5CYII=
</value>
</data>
<data name="toolStripButton2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL1SURBVEhLtVZbTxNBFCZeYrxEjY8++KKiMfHFRAgvCv4H
o/4Bn9RoDBETzcQgRmjLtrbQVuwFygKloZZud5dLJYZCdxce5NpCQMrFpLyYlKeSCFl7mmlizEB3YPsl
XyY7e+b7MufMnN0yPfDC5D/52ui8/q6lpwZGeMav9Mf93t6jjE947hVkMTCeXI/OpLfHUlsqjPDsys0z
nZFnCKEjeMnh0dQerPIOKJKS2tqZ/q2qe1FJZXbcvBT/0B6uwksPDsYnPgpP/lwnGe3FoLSwZmaFh1iC
HgZ3+HZIWVwliRdjcGL5VxN7gJ1DTSG9JFGthLRT1xwOUrGaFqO8ktmBA4cltcHDSwMkMVp6eVnEksXx
0tBxOhhLbJCEaAlXTfM9r238cu3b7OY2SYiW4kw6W9vovoql9wdq7bo3lsoQhWgZW8moyNpdjaX3R53x
c/nAzGaWJERLcSqdrTO1XcHS+wMh5ymoDUmIln3x5BpVL4feSxKipUeUeSypDXD/oPeSxLRSTmX+mDv4
J1hSG6DjuMTDdS6PII1Td67cgmNGT/9wv7xIFC3G0MTyBnWvfmqxnGjuCHFcfFb1RyfV8MQSUXwvwteJ
6eYfYDltgBNt8H4VOWlWFZSEysXn1CZPKObi4hL0XpJRgVBTSK/BFarEctqAGM/53E5jEWkubwqj0R0a
hAxAreDAuUVZgCsiTqez8AcCY1BKrkJPhoNEX1NT2wUry49G5Pm8KS/Nq80+boh0B2EOmgyyd1fDeOB/
LmTtumjt4hWhYKrMq2Y2MopstjM4RH/UW7yXbX5+is8ZgimYmzvDk5ABHKI/Guy+G3b/4FzeML/ThGpj
+SnIAA7RH+8dPbccgWiiYAq0B8QfyNx+CYfoj3pH5x1H3/DSf6aJ3OerHIfoj1cfnedaA9HFf03bgtHk
G6v/Jg4pDd4yrsrAiLxbMHXldo4+sRX4denw2Ok8zvi4770j0q6zb2ihoYW9i1+VHmCOTN4KZPGdxVMl
RlnZX9i+Wt0gvITgAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="dSMail.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>90, 17</value>
</metadata>
<metadata name="suid.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="sdate.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="SendMsg2.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@@ -1,295 +0,0 @@
namespace FCM0000
{
partial class fSendMail
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.Label tolistLabel;
System.Windows.Forms.Label bccLabel;
System.Windows.Forms.Label ccLabel;
System.Windows.Forms.Label subjectLabel;
System.Windows.Forms.Label bodyLabel;
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fSendMail));
this.bn = new System.Windows.Forms.BindingNavigator(this.components);
this.bs = new System.Windows.Forms.BindingSource(this.components);
this.dsMSSQL = new FCM0000.DSMail();
this.btSend = new System.Windows.Forms.ToolStripButton();
this.btOUtlook = new System.Windows.Forms.ToolStripButton();
this.panel1 = new System.Windows.Forms.Panel();
this.tbBody = new YARTE.UI.HtmlEditor();
this.tbTo = new System.Windows.Forms.TextBox();
this.tbBCC = new System.Windows.Forms.TextBox();
this.tbCC = new System.Windows.Forms.TextBox();
this.tbSubject = new System.Windows.Forms.TextBox();
this.tam = new FCM0000.DSMailTableAdapters.TableAdapterManager();
this.ta = new FCM0000.DSMailTableAdapters.MailDataTableAdapter();
this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
tolistLabel = new System.Windows.Forms.Label();
bccLabel = new System.Windows.Forms.Label();
ccLabel = new System.Windows.Forms.Label();
subjectLabel = new System.Windows.Forms.Label();
bodyLabel = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.bn)).BeginInit();
this.bn.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).BeginInit();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// tolistLabel
//
tolistLabel.AutoSize = true;
tolistLabel.Location = new System.Drawing.Point(30, 15);
tolistLabel.Name = "tolistLabel";
tolistLabel.Size = new System.Drawing.Size(35, 12);
tolistLabel.TabIndex = 0;
tolistLabel.Text = "tolist:";
//
// bccLabel
//
bccLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
bccLabel.AutoSize = true;
bccLabel.Location = new System.Drawing.Point(35, 467);
bccLabel.Name = "bccLabel";
bccLabel.Size = new System.Drawing.Size(30, 12);
bccLabel.TabIndex = 8;
bccLabel.Text = "bcc:";
//
// ccLabel
//
ccLabel.AutoSize = true;
ccLabel.Location = new System.Drawing.Point(42, 43);
ccLabel.Name = "ccLabel";
ccLabel.Size = new System.Drawing.Size(23, 12);
ccLabel.TabIndex = 2;
ccLabel.Text = "cc:";
//
// subjectLabel
//
subjectLabel.AutoSize = true;
subjectLabel.Location = new System.Drawing.Point(15, 71);
subjectLabel.Name = "subjectLabel";
subjectLabel.Size = new System.Drawing.Size(50, 12);
subjectLabel.TabIndex = 4;
subjectLabel.Text = "subject:";
//
// bodyLabel
//
bodyLabel.AutoSize = true;
bodyLabel.Location = new System.Drawing.Point(28, 97);
bodyLabel.Name = "bodyLabel";
bodyLabel.Size = new System.Drawing.Size(37, 12);
bodyLabel.TabIndex = 6;
bodyLabel.Text = "body:";
//
// bn
//
this.bn.AddNewItem = null;
this.bn.BindingSource = this.bs;
this.bn.CountItem = null;
this.bn.DeleteItem = null;
this.bn.Dock = System.Windows.Forms.DockStyle.Bottom;
this.bn.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.btSend,
this.btOUtlook,
this.toolStripButton1});
this.bn.Location = new System.Drawing.Point(0, 498);
this.bn.MoveFirstItem = null;
this.bn.MoveLastItem = null;
this.bn.MoveNextItem = null;
this.bn.MovePreviousItem = null;
this.bn.Name = "bn";
this.bn.PositionItem = null;
this.bn.Size = new System.Drawing.Size(579, 25);
this.bn.TabIndex = 0;
this.bn.Text = "bindingNavigator1";
//
// bs
//
this.bs.DataMember = "MailData";
this.bs.DataSource = this.dsMSSQL;
//
// dsMSSQL
//
this.dsMSSQL.DataSetName = "dsMSSQL";
this.dsMSSQL.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// btSend
//
this.btSend.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.btSend.Image = ((System.Drawing.Image)(resources.GetObject("btSend.Image")));
this.btSend.Name = "btSend";
this.btSend.Size = new System.Drawing.Size(69, 22);
this.btSend.Text = "Send(&S)";
this.btSend.Click += new System.EventHandler(this.mailFormBindingNavigatorSaveItem_Click);
//
// btOUtlook
//
this.btOUtlook.Image = global::FCM0000.Properties.Resources.action_refresh;
this.btOUtlook.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btOUtlook.Name = "btOUtlook";
this.btOUtlook.Size = new System.Drawing.Size(90, 22);
this.btOUtlook.Text = "To OutLook";
this.btOUtlook.Click += new System.EventHandler(this.toolStripButton1_Click_1);
//
// panel1
//
this.panel1.Controls.Add(this.tbBody);
this.panel1.Controls.Add(tolistLabel);
this.panel1.Controls.Add(this.tbTo);
this.panel1.Controls.Add(bccLabel);
this.panel1.Controls.Add(this.tbBCC);
this.panel1.Controls.Add(ccLabel);
this.panel1.Controls.Add(this.tbCC);
this.panel1.Controls.Add(subjectLabel);
this.panel1.Controls.Add(this.tbSubject);
this.panel1.Controls.Add(bodyLabel);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(579, 498);
this.panel1.TabIndex = 1;
//
// tbBody
//
this.tbBody.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbBody.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.tbBody.Html = "";
this.tbBody.Location = new System.Drawing.Point(74, 97);
this.tbBody.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.tbBody.Name = "tbBody";
this.tbBody.ReadOnly = false;
this.tbBody.ShowToolbar = true;
this.tbBody.Size = new System.Drawing.Size(493, 361);
this.tbBody.TabIndex = 7;
//
// tbTo
//
this.tbTo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbTo.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "tolist", true));
this.tbTo.Location = new System.Drawing.Point(74, 12);
this.tbTo.Name = "tbTo";
this.tbTo.Size = new System.Drawing.Size(493, 21);
this.tbTo.TabIndex = 1;
//
// tbBCC
//
this.tbBCC.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbBCC.BackColor = System.Drawing.Color.SkyBlue;
this.tbBCC.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "bcc", true));
this.tbBCC.Location = new System.Drawing.Point(74, 464);
this.tbBCC.Name = "tbBCC";
this.tbBCC.Size = new System.Drawing.Size(493, 21);
this.tbBCC.TabIndex = 9;
//
// tbCC
//
this.tbCC.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbCC.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "cc", true));
this.tbCC.Location = new System.Drawing.Point(74, 40);
this.tbCC.Name = "tbCC";
this.tbCC.Size = new System.Drawing.Size(493, 21);
this.tbCC.TabIndex = 3;
//
// tbSubject
//
this.tbSubject.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbSubject.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bs, "subject", true));
this.tbSubject.Location = new System.Drawing.Point(74, 68);
this.tbSubject.Name = "tbSubject";
this.tbSubject.Size = new System.Drawing.Size(493, 21);
this.tbSubject.TabIndex = 5;
//
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.MailAutoTableAdapter = null;
this.tam.MailDataTableAdapter = this.ta;
this.tam.MailFormTableAdapter = null;
this.tam.UpdateOrder = FCM0000.DSMailTableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete;
//
// ta
//
this.ta.ClearBeforeFill = true;
//
// toolStripButton1
//
this.toolStripButton1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));
this.toolStripButton1.Name = "toolStripButton1";
this.toolStripButton1.Size = new System.Drawing.Size(90, 22);
this.toolStripButton1.Text = "Direct Send";
this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click);
//
// fSendMail
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(579, 523);
this.Controls.Add(this.panel1);
this.Controls.Add(this.bn);
this.Name = "fSendMail";
this.Text = "Send Mail";
this.Load += new System.EventHandler(this.fMailform_Load);
((System.ComponentModel.ISupportInitialize)(this.bn)).EndInit();
this.bn.ResumeLayout(false);
this.bn.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.bs)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dsMSSQL)).EndInit();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private DSMail dsMSSQL;
private System.Windows.Forms.BindingSource bs;
private DSMailTableAdapters.TableAdapterManager tam;
private System.Windows.Forms.BindingNavigator bn;
private System.Windows.Forms.ToolStripButton btSend;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.TextBox tbTo;
private System.Windows.Forms.TextBox tbBCC;
private System.Windows.Forms.TextBox tbCC;
private System.Windows.Forms.TextBox tbSubject;
private YARTE.UI.HtmlEditor tbBody;
private DSMailTableAdapters.MailDataTableAdapter ta;
private System.Windows.Forms.ToolStripButton btOUtlook;
private System.Windows.Forms.ToolStripButton toolStripButton1;
}
}

View File

@@ -1,145 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using YARTE.UI.Buttons;
using NetOffice;
using Outlook = NetOffice.OutlookApi;
using NetOffice.OutlookApi.Enums;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Tab;
namespace FCM0000
{
public partial class fSendMail : FCOMMON.fBase
{
public fSendMail()
{
InitializeComponent();
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
PredefinedButtonSets.SetupDefaultButtons(this.tbBody);
this.dsMSSQL.MailData.TableNewRow += MailForm_TableNewRow;
}
void MailForm_TableNewRow(object sender, DataTableNewRowEventArgs e)
{
e.Row["gcode"] = FCOMMON.info.Login.gcode;
e.Row["wuid"] = FCOMMON.info.Login.no;
e.Row["wdate"] = DateTime.Now;
e.Row["cate"] = "NR";
e.Row["pdate"] = DateTime.Now.ToShortDateString();
e.Row["fromlist"] = "gw@amkor.co.kr";
}
private void fMailform_Load(object sender, EventArgs e)
{
EnsureVisibleAndUsableSize();
this.bs.AddNew(); //신규메일데이터생성
LoadNRData();
}
void LoadNRData()
{
//자로에서 불러와서 그 값을 가져온다.
var taMF = new DSMailTableAdapters.MailFormTableAdapter();
var data = taMF.GetByCate(FCOMMON.info.Login.gcode, "NR");
if (data != null && data.Rows.Count > 0)
{
var drForm = data.Rows[0] as DSMail.MailFormRow;
this.tbSubject.Text = drForm.subject;
this.tbBody.Html = drForm.body;
this.tbTo.Text = drForm.tolist;
//this.tbBCC.Text = drForm.bcc;
//this.tbCC.Text = drForm.cc;
}
}
private void mailFormBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
var drv = this.bs.Current as DataRowView;
drv["subject"] = this.tbSubject.Text;
drv["body"] = this.tbBody.Html;
drv.EndEdit();
this.bs.EndEdit();
var cnt = this.tam.UpdateAll(this.dsMSSQL);
MessageBox.Show($"{cnt}");
this.bs.AddNew();
tbTo.Text = FCOMMON.info.Login.email;
}
private void toolStripButton1_Click_1(object sender, EventArgs e)
{
var drv = this.bs.Current as DataRowView;
if (drv == null) return;
var dr = drv.Row as DSMail.MailFormRow;
var tolist = new string[] { "Chikyun.kim@amkor.co.kr" }; //dr.tolist.Split(',');
Outlook.Application outlookApplication = new Outlook.Application();
foreach (var to in tolist)
{
if (to.isEmpty()) continue;
var newMail = outlookApplication.CreateItem(OlItemType.olMailItem) as Outlook.MailItem;
newMail.Display();
newMail.Subject = this.tbSubject.Text.Trim(); // dr.title;
newMail.To = to;
newMail.CC = tbCC.Text.Trim();
newMail.BCC = tbBCC.Text.Trim();
// newMail.BodyFormat = OlBodyFormat.olFormatHTML;
newMail.HTMLBody = this.tbBody.Html
.Replace("{USER}", FCOMMON.info.Login.nameK)
.Replace("{EUSER}", FCOMMON.info.Login.nameE)
.Replace("{EMAIL}", FCOMMON.info.Login.email)
.Replace("%7BEMAIL%7D", FCOMMON.info.Login.email)
.Replace("{HP}", FCOMMON.info.Login.hp)
.Replace("{TEL}", FCOMMON.info.Login.tel)
.Replace("{ITEM}", tbSubject.Text) + newMail.HTMLBody;
}
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
//direct send
var list_from = "gw@amkor.co.kr";
var list_to = tbTo.Text;
var subject = tbSubject.Text;
var body = tbBody.Html;
var list_bcc = tbBCC.Text;
var list_cc = tbCC.Text;
//전송을 해야 함
var mc = new System.Net.Mail.SmtpClient(FCOMMON.info.mailserver);
var msg = new System.Net.Mail.MailMessage
(list_from,
list_to,
subject,
body);
if (list_bcc != "") msg.Bcc.Add(list_bcc);
if (list_cc != "") msg.CC.Add(list_cc);
msg.IsBodyHtml = true;
try
{
mc.Send(msg);
MessageBox.Show("ok");
}
catch (Exception eX)
{
MessageBox.Show(eX.Message);
}
}
}
}

View File

@@ -1,168 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="tolistLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="bccLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="ccLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="subjectLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="bodyLabel.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="bn.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>259, 17</value>
</metadata>
<metadata name="bs.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>122, 17</value>
</metadata>
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btSend.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wgAADsIBFShKgAAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
</value>
</data>
<data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wQAADsEBuJFr7QAAAExJREFUOE9joAr49u3bf1IxVCsEgAWC58Dxh/cf4RhZDETHTNiHaQgpBoAwzBCo
dtINAGGiDUDGyGpoawAxeNSAQWkAORiqnRLAwAAA9EMMU8Daa3MAAAAASUVORK5CYII=
</value>
</data>
<metadata name="dsMSSQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="tam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>186, 17</value>
</metadata>
<metadata name="ta.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>325, 17</value>
</metadata>
</root>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -4,19 +4,18 @@
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
</autogenerated>-->
<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="-10" ViewPortY="-12" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="185" ViewPortY="-12" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
<Shapes>
<Shape ID="DesignTable:Items" ZOrder="3" X="48" Y="30" Height="590" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="387" />
<Shape ID="DesignTable:Common" ZOrder="4" X="443" Y="45" Height="267" Width="211" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
<Shape ID="DesignTable:Board" ZOrder="1" X="937" Y="65" Height="438" Width="179" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="370" />
<Shape ID="DesignTable:RequestItem" ZOrder="11" X="1499" Y="70" Height="324" Width="219" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Customs" ZOrder="10" X="1788" Y="70" Height="362" Width="263" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Staff" ZOrder="9" X="2121" Y="70" Height="286" Width="172" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
<Shape ID="DesignTable:Purchase" ZOrder="8" X="2357" Y="30" Height="664" Width="245" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="556" />
<Shape ID="DesignTable:Projects" ZOrder="7" X="2672" Y="70" Height="628" Width="246" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="541" />
<Shape ID="DesignTable:HolidayLIst" ZOrder="6" X="2988" Y="70" Height="191" Width="210" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
<Shape ID="DesignTable:InventoryUser" ZOrder="5" X="3268" Y="70" Height="343" Width="278" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:EETGW_DocuForm" ZOrder="2" X="747" Y="396" Height="210" Width="253" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="159" />
<Shape ID="DesignTable:Items" ZOrder="2" X="48" Y="30" Height="590" Width="300" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="387" />
<Shape ID="DesignTable:Common" ZOrder="3" X="443" Y="45" Height="267" Width="211" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="216" />
<Shape ID="DesignTable:RequestItem" ZOrder="10" X="1499" Y="70" Height="324" Width="219" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Customs" ZOrder="9" X="1788" Y="70" Height="362" Width="263" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:Staff" ZOrder="8" X="2121" Y="70" Height="286" Width="172" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="235" />
<Shape ID="DesignTable:Purchase" ZOrder="7" X="2357" Y="30" Height="664" Width="245" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="556" />
<Shape ID="DesignTable:Projects" ZOrder="6" X="2672" Y="70" Height="628" Width="246" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="541" />
<Shape ID="DesignTable:HolidayLIst" ZOrder="5" X="2988" Y="70" Height="191" Width="210" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="140" />
<Shape ID="DesignTable:InventoryUser" ZOrder="4" X="3268" Y="70" Height="343" Width="278" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="254" />
<Shape ID="DesignTable:EETGW_DocuForm" ZOrder="1" X="747" Y="396" Height="210" Width="253" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="159" />
</Shapes>
<Connectors />
</DiagramLayout>

View File

@@ -377,7 +377,6 @@
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.CommonTableAdapter = this.ta;
this.tam.CustomsTableAdapter = null;
this.tam.EETGW_DocuFormTableAdapter = null;

View File

@@ -134,7 +134,6 @@
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.CommonTableAdapter = null;
this.tam.CustomsTableAdapter = this.ta;
this.tam.HolidayLIstTableAdapter = null;

View File

@@ -53,7 +53,7 @@ namespace FCM0000
var newdr = this.dsMSSQL.HolidayLIst.NewHolidayLIstRow();
newdr.wuid = FCOMMON.info.Login.no;
newdr.wdate = DateTime.Now;
newdr.pdate = dayvalue.ToShortDateString();// textBox1.Text.Trim() + "-" + i.ToString("00");
newdr.pdate = dayvalue.ToString("yyyy-MM-dd");// textBox1.Text.Trim() + "-" + i.ToString("00");
if (dayvalue.DayOfWeek == DayOfWeek.Saturday )
{
newdr.free = true;

View File

@@ -405,7 +405,6 @@
// tam
//
this.tam.BackupDataSetBeforeUpdate = false;
this.tam.BoardTableAdapter = null;
this.tam.CommonTableAdapter = null;
this.tam.CustomsTableAdapter = null;
this.tam.EETGW_DocuFormTableAdapter = null;

View File

@@ -37,7 +37,7 @@ namespace FCOMMON
var cmd = new System.Data.SqlClient.SqlCommand(sql1, cn);
cmd.Parameters.Add("gcode", SqlDbType.VarChar).Value = gcode;
cmd.Parameters.Add("date", SqlDbType.VarChar).Value = DateTime.Now.AddYears(-1).ToShortDateString();
cmd.Parameters.Add("date", SqlDbType.VarChar).Value = DateTime.Now.AddYears(-1).ToString("yyyy-MM-dd");
cnt1 = (int)cmd.ExecuteScalar();
cmd.CommandText = sql2;
cnt2 = (int)cmd.ExecuteScalar();
@@ -115,9 +115,9 @@ namespace FCOMMON
var sql = "select gcode,id,level,isnull(Process,'') as Process ,isnull(name,'') as name,isnull(useUserState,0) as useAccount,isnull(useJobReport,0) as useJobReport "+
" from vGroupUser where "+
" gcode = @gcode "+
var sql = "select gcode,id,level,isnull(Process,'') as Process ,isnull(name,'') as name,isnull(useUserState,0) as useAccount,isnull(useJobReport,0) as useJobReport " +
" from vGroupUser where " +
" gcode = @gcode " +
" and id = @uid";
var cmd = new System.Data.SqlClient.SqlCommand(sql, cn);
cmd.Parameters.Add("gcode", SqlDbType.VarChar).Value = gcode;
@@ -167,7 +167,8 @@ namespace FCOMMON
var cnt = 0;
while (rdr.Read())
{
retval.Add(new GroupUserModel {
retval.Add(new GroupUserModel
{
Gcode = rdr["gcode"].ToString(),
uid = rdr["id"].ToString(),
level = int.Parse(rdr["level"]?.ToString() ?? "0"),
@@ -1154,7 +1155,7 @@ namespace FCOMMON
public static Boolean InsertLog(string cate, string remark, string pdate = "")
{
if (String.IsNullOrEmpty(pdate)) pdate = DateTime.Now.ToShortDateString();
if (String.IsNullOrEmpty(pdate)) pdate = DateTime.Now.ToString("yyyy-MM-dd");
try
{
@@ -1572,6 +1573,50 @@ namespace FCOMMON
return currentusername;
}
public static bool GetUserGroupUseNR()
{
var cn = getCn();
cn.Open();
int retval = 0;
var cmd2 = new SqlCommand($"select isnull(usenr,1) from UserGroup where gcode = '{FCOMMON.info.Login.gcode}'", cn);
try
{
var value = cmd2.ExecuteScalar();
retval = value.ToString().ToLower() == "true" ? 1 : 0;
//if (int.TryParse(value.ToString(), out retval))
//{
//}
//else retval = 0;
}
catch (Exception ex)
{
}
return retval > 0;
}
public static bool SetUserGroupUseNR(bool a)
{
var cn = getCn();
cn.Open();
var value = a ? 1 : 0;
int retval = 0;
var cmd2 = new SqlCommand($"update UserGroup set usenr = {value} where gcode = '{FCOMMON.info.Login.gcode}'", cn);
try
{
retval = cmd2.ExecuteNonQuery();
}
catch(Exception ex)
{
}
return retval == 1;
}
public static int addItem(string pumname, string sid, string model, decimal price, string supply, int supplyidx = -1, byte[] pic = null)
{

Some files were not shown because too many files have changed in this diff Show More