プロジェクト

全般

プロフィール

リビジョン 162

堀内7年以上前に追加

システムマスタ、ホームページURL対応
見積書表示、ホームページURL対応
注文書、法定福利費対応
給与計算、月内日数対応
日時更新処理、サーバー起動対応(サーバー側処理ソース追加)
システムマスタ変更SQL修正版に差し替え

差分を表示:

branches/ddl/20170525_SQL.txt
16 16
	Address3 varchar(60) COMMENT '?Z??3',
17 17
	PhoneNumber varchar(13) DEFAULT '' NOT NULL COMMENT '?d?b???',
18 18
	FaxNumber varchar(13) DEFAULT '' COMMENT 'FAX???',
19
	HomePageURL varchar(120) DEFAULT '' COMMENT '?z?[???y?[?WURL',
19 20
	ConstructionExpenses decimal(4,2) NOT NULL COMMENT '?H?????o??',
20 21
	OfficeExpenses decimal(4,2) NOT NULL COMMENT '???????o??',
21 22
	OperatingExpenses decimal(4,2) NOT NULL COMMENT '?c??o??',
......
49 50
	Address3,
50 51
	PhoneNumber,
51 52
	FaxNumber,
53
	'',
52 54
	ConstructionExpenses,
53 55
	OfficeExpenses,
54 56
	OperatingExpenses,
branches/src/DataCheckExcute/DataCheckExcute/App.config
1
<?xml version="1.0" encoding="utf-8"?>
2
<configuration>
3
  <startup>
4
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
5
  </startup>
6
</configuration>
branches/src/DataCheckExcute/DataCheckExcute/Common/CommonVersion.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading.Tasks;
6

  
7
namespace ProcessManagement.Common
8
{
9
    /// <summary>
10
    /// システムバージョン定義クラス
11
    /// </summary>
12
    public static class CommonVersion
13
    {
14
        /// <summary>
15
        /// 本体バージョン
16
        /// </summary>
17
        public static int s_SystemVersion = 0;
18
    }
19
}
branches/src/DataCheckExcute/DataCheckExcute/Common/Process/ClsChangeLedgerData.cs
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Windows.Forms;
9
using System.Collections;
10
using System.Diagnostics;
11

  
12
using log4net;
13
using log4net.Appender;
14
using log4net.Repository.Hierarchy;
15

  
16
using ProcessManagement.Common;
17
using ProcessManagement.DB.IOAccess;
18
using ProcessManagement.DataModel;
19
using ProcessManagement.Forms.DataEntry;
20

  
21
//*----------------------- 工事詳細台帳データ変更クラス -----------------------*
22
//  2016/05/31  Ver1.0.0.0      Create Source           
23
//
24
//
25
//
26
//*----------------------------------------------------------------------------*
27
namespace ProcessManagement.Common
28
{
29
    /// <summary>
30
    /// 工事詳細台帳データ変更クラス
31
    /// </summary>
32
    public static class ClsChangeLedgerData
33
    {
34
        #region ログ定義
35
        /// <summary>
36
        /// log4netログを使用する
37
        /// </summary>
38
        private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
39
        #endregion
40

  
41
        #region 定数
42

  
43
        #endregion
44

  
45
        #region 変数
46
        /// <summary>
47
        /// 工事施工台帳支払い実績先頭カラム数
48
        /// </summary>
49
        private static int m_LedgerColumnCount = 0;
50
        #endregion
51

  
52
        #region 工事詳細台帳再計算処理(総支払額・粗利・給与・純利益が対象)
53
        /// <summary>
54
        /// 工事詳細台帳再計算処理(総支払額・粗利・給与・純利益が対象)
55
        /// </summary>
56
        /// <param name="ConstrCode"></param>
57
        private static bool LedgerRecalculate(IOConstructionLedgerExcute LedgerExcuteDB, List<int> ConstrCodeList)
58
        {
59
            try
60
            {
61
                string strSQL = string.Empty;
62
                bool bRet = true;
63
                foreach (int ConstrCode in ConstrCodeList)
64
                {
65
                    // 工事台帳実行データよりグループごとの合計金額を取得する
66
                    strSQL = "SELECT GROUPCOUNT, SUM(PAYMENTAMOUNT)";
67
                    strSQL += " FROM CONSTRUCTIONLEDGEREXCUTE";
68
                    strSQL += string.Format(" WHERE CONSTRUCTIONCODE = {0}", ConstrCode);
69
                    strSQL += " GROUP BY GROUPCOUNT";
70
                    strSQL += " ORDER BY GROUPCOUNT";
71

  
72
                    ArrayList InData = new ArrayList();
73
                    if (!LedgerExcuteDB.ExecuteReader(strSQL, ref InData, false)) continue;
74

  
75
                    // データ無は次のデータ
76
                    if (InData.Count == 0) continue;
77

  
78
                    // 対象データ取得
79
                    List<int> GroupCodeList = new List<int>();
80
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.Expenses);               // 1:経費
81

  
82
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.ConstructionCosts);      // 2:施工費
83

  
84
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.TransportationCosts);    // 3:交通費(通行料・電車代)
85
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.PurchaseCosts);          // 4:購入品
86
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.VehicleLeaseFee);        // 5:車両リース代
87
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.ParkingCosts);           // 6:駐車場・資材置き場
88
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.RoomChargeCosts);        // 7:宿泊費
89

  
90
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.DisposeCosts);           // 8:処分費等
91
                    int Payment = CalcGetTotal(InData, GroupCodeList);                              // ----- 支払額
92

  
93
                    GroupCodeList.Clear();
94
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.Instructor);             // 9:指導員給料行
95
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.Assistant);              // 10:副担当者給料行
96
                    int PExpenses = CalcGetTotal(InData, GroupCodeList);                            // ----- 人件費
97

  
98
                    GroupCodeList.Clear();
99
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.Payroll);                // 11:担当者給料行
100
                    int Allowance = CalcGetTotal(InData, GroupCodeList);                            // ----- 給与
101

  
102
                    GroupCodeList.Clear();
103
                    GroupCodeList.Add((int)FrmConstructionLedger.DataGroup.BillingAmount);          // 14:請求金額
104
                    int Billing = CalcGetTotal(InData, GroupCodeList);                              // ----- 請求額
105

  
106
                    // ----- 工事詳細台帳更新
107
                    strSQL = "UPDATE CONSTRUCTIONLEDGER SET";
108
                    strSQL += string.Format(" TOTALPAYMENT = {0}", Payment);
109
                    strSQL += string.Format(" , GROSSPROFIT = {0}", (Billing - Payment));
110
                    strSQL += string.Format(" , Allowance = {0}", Allowance);
111
                    strSQL += string.Format(" , NETPROFIT = {0}", (Billing - (Payment + Allowance + PExpenses)));
112
                    strSQL += string.Format(" WHERE CONSTRUCTIONCODE = {0}", ConstrCode);
113
                    if (!LedgerExcuteDB.ExecuteNonQuery(strSQL, false))
114
                    {
115
                        bRet = false;
116
                        break;
117
                    }
118
                }
119
                return bRet;
120
            }
121
            catch (System.Exception ex)
122
            {
123
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
124
                return false;
125
            }
126
        }
127
        #endregion
128

  
129
        #region 配列リストより指定された合計を取得する
130
        /// <summary>
131
        /// 配列リストより指定された合計を取得する
132
        /// </summary>
133
        private static int CalcGetTotal(ArrayList InData, List<int> GroupCodeList)
134
        {
135
            try
136
            {
137
                int iRetVal = 0;
138

  
139
                int GrpNo = -1;
140
                foreach (int GroupCode in GroupCodeList)
141
                {
142
                    foreach (object[] CurRec in InData)
143
                    {
144
                        GrpNo = CommonMotions.cnvInt(CurRec[0]);
145

  
146
                        if (GroupCode != GrpNo) continue;
147

  
148
                        iRetVal += CommonMotions.cnvInt(CurRec[1]);
149
                    }
150
                }
151

  
152
                return iRetVal;
153
            }
154
            catch (System.Exception ex)
155
            {
156
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
157
                return 0;
158
            }
159
        }
160
        #endregion
161

  
162
        #region 工事詳細台帳より支払金額グリッドの先頭カラム数を取得する
163
        /// <summary>
164
        /// 工事詳細台帳より支払金額グリッドの先頭カラム数を取得する
165
        /// </summary>
166
        private static void GetLedgerColumnCount()
167
        {
168
            try
169
            {
170
                m_LedgerColumnCount = Enum.GetNames(typeof(FrmConstructionLedger.GridColumn)).Length - 1;
171
            }
172
            catch (System.Exception ex)
173
            {
174
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
175
            }
176
        }
177
        #endregion
178

  
179
        #region 工事詳細台帳データに対象行の支払い給与を計算する
180
        /// <summary>
181
        /// 工事詳細台帳データに対象行の支払い給与を計算する
182
        /// </summary>
183
        /// <param name="ConstrCode">工事番号</param>
184
        /// <param name="TargetDate">対象日</param>
185
        /// <param name="bSetFlag">月一括セットフラグ</param>
186
        /// <returns></returns>
187
        public static bool CalculatePayment(List<ConstructionLedger> LedgerList)
188
        {
189
            IOConstructionLedgerDetail LedgerDeDB = new IOConstructionLedgerDetail();
190
            IOConstructionLedgerExcute LedgerExDB = new IOConstructionLedgerExcute();
191
            IOMPersonInCharge PersonDB = new IOMPersonInCharge();
192
            try
193
            {
194
                bool bret = true;
195
                List<int> ConstrCodeList = new List<int>();
196

  
197
                LedgerDeDB.connect(); LedgerDeDB.beginTran();
198
                LedgerExDB.connect(); LedgerExDB.beginTran();
199
                PersonDB.connect(); PersonDB.beginTran();
200

  
201
                foreach (ConstructionLedger LedgerRec in LedgerList)
202
                {
203

  
204
                    // 工事詳細台帳明細データ取得
205
                    List<ConstructionLedgerDetail> DetailList = new List<ConstructionLedgerDetail>();
206
                    string DetailSQL = LedgerDeDB.CreatePrimarykeyString(LedgerRec.ConstructionCode);
207
                    DetailSQL += string.Format(" AND OperatingFlg = {0}", (int)CommonDefine.SalaryOperateKind.Oparateing);  // 対応中フラグ
208
                    DetailSQL += string.Format(" AND SALARYFLG != {0}", (int)CommonDefine.SalaryDevision.Noting);           // 給与振分区分
209
                    DetailSQL += string.Format(" AND GROUPCOUNT IN ({0},{1},{2})",
210
                                                                    (int)FrmConstructionLedger.DataGroup.Instructor,        // 指導員給料
211
                                                                    (int)FrmConstructionLedger.DataGroup.Assistant,         // 副担当者給料
212
                                                                    (int)FrmConstructionLedger.DataGroup.Payroll);          // 担当者給料行
213

  
214
                    if (!LedgerDeDB.SelectAction(DetailSQL, ref DetailList, false) || DetailList.Count == 0) continue;
215

  
216
                    DateTime TargetDate = DateTime.Now.Date;
217
                    // 対象月より書込みカラム位置を取得する
218
                    int ColPoint = CalcTargetMonthToColumn(LedgerRec.ConstructionStart, TargetDate);
219

  
220
                    foreach (ConstructionLedgerDetail CurRec in DetailList)
221
                    {
222
                        // コードが担当者ではない場合は処理しない
223
                        if (CurRec.CompanyType != (int)CommonDefine.CodeDataType.Person) continue;
224
                        // コードがない場合は処理しない
225
                        if (CurRec.CompanyCode == 0) continue;
226
                        // 施工管理中担当者ではない場合は処理しない
227
                        if (CurRec.OperatingFlg == (int)CommonDefine.SalaryOperateKind.Complate) continue;
228

  
229
                        //if (LedgerRec.ConstructionCode == 2016043601)
230
                        //{
231
                        //    Debug.WriteLine("stop");
232
                        //}
233

  
234
                        // セットする金額を計算する
235
                        switch (CurRec.SalaryFlg)
236
                        {
237
                            case (int)CommonDefine.SalaryDevision.All:          // 全日振分
238
                                bret = CalcSalaryDevisionAll(LedgerExDB, PersonDB, LedgerRec, CurRec, TargetDate.Date, ColPoint);
239
                                break;
240
                            case (int)CommonDefine.SalaryDevision.Noting:       // 振分無
241
                                bret = CalcSalaryDevisionNoting(LedgerExDB, CurRec, TargetDate.Date, ColPoint);
242
                                break;
243
                            case (int)CommonDefine.SalaryDevision.DaysInput:    // 日数入力
244
                                bret = CalcSalaryDevisionDaysInput(LedgerExDB, PersonDB, LedgerRec, CurRec);
245
                                break;
246
                            default:
247
                                break;
248
                        }
249
                    }
250
                    ConstrCodeList.Add(LedgerRec.ConstructionCode);
251
                }
252

  
253
                if (bret)
254
                {
255
                    // 工事台帳更新
256
                    bret = LedgerRecalculate(LedgerExDB, ConstrCodeList);
257
                }
258

  
259
                // エラー時ロールバック
260
                if (!bret) LedgerExDB.rollback();
261

  
262
                // DB Commit
263
                LedgerExDB.commit();
264

  
265
                return bret;
266
            }
267
            catch (Exception ex)
268
            {
269
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
270
                return false;
271
            }
272
            finally
273
            {
274
                LedgerDeDB.close(); LedgerDeDB = null;
275
                LedgerExDB.close(); LedgerExDB = null;
276
                PersonDB.close(); PersonDB = null;
277
            }
278
        }
279
        #endregion
280

  
281
        #region 全日振分時の給与書込み
282
        /// <summary>
283
        /// 全日振分時の給与書込み
284
        /// </summary>
285
        private static bool CalcSalaryDevisionAll(IOConstructionLedgerExcute LedgerExDB,
286
                                                    IOMPersonInCharge PersonDB,
287
                                                    ConstructionLedger LedgerRec,
288
                                                    ConstructionLedgerDetail CurRec,
289
                                                    DateTime CalcEndtDate,
290
                                                    int ColPoint)
291
        {
292
            try
293
            {
294
                DateTime StartDate = DateTime.Now;
295
                DateTime CompDate = DateTime.Now;
296

  
297
                // ----- 計算開始日取得
298
                if (LedgerRec.ConstructionStart.Year == CalcEndtDate.Year
299
                    && LedgerRec.ConstructionStart.Month == CalcEndtDate.Month)
300
                {   // 対象期間の開始が当月の場合は工事開始日を開始にする
301
                    StartDate = LedgerRec.ConstructionStart;
302
                }
303
                else
304
                {   // 違う場合は月初
305
                    StartDate = DateTime.Parse(string.Format("{0}/{1}/{2}", CalcEndtDate.Year, CalcEndtDate.Month, 1));
306
                }
307
                // ----- 計算終了日取得
308
                if (LedgerRec.ConstructionEnd.Year == CalcEndtDate.Year
309
                    && LedgerRec.ConstructionEnd.Month == CalcEndtDate.Month)
310
                {   // 対象期間の終了が当月の場合は工事終了日を終了にする
311
                    CompDate = LedgerRec.ConstructionEnd;
312
                }
313
                else
314
                {   // 違う場合は終了日
315
                    CompDate = CalcEndtDate;
316
                }
317

  
318
                int SumSaraly = 0;
319

  
320
                // 月末日より月日数を取得する
321
                int MonthDayCnt = DateTimeUtil.EndOfMonth(CalcEndtDate).Day;
322
                // 経過日数を取得する
323
                TimeSpan ts = CompDate - StartDate;
324
                // 支払給与計算
325
                switch (CurRec.GroupCount)
326
                {
327
                    case (int)FrmConstructionLedger.DataGroup.Instructor:       // 指導員給料
328
                        SumSaraly = CommonMotions.cnvRound((double)CommonDefine.InstructorMonthryCost / MonthDayCnt);
329
                        SumSaraly *= (ts.Days + 1);
330
                        break;
331
                    case (int)FrmConstructionLedger.DataGroup.Assistant:        // 副担当者給料
332
                        SumSaraly = CommonMotions.cnvRound((double)CommonDefine.AssistantMonthryCost / MonthDayCnt);
333
                        SumSaraly *= (ts.Days + 1);
334
                        break;
335
                    case (int)FrmConstructionLedger.DataGroup.Payroll:          // 担当者給料行
336
                        // 範囲給与取得
337
                        SumSaraly = CommonMotions.CalcElapsedSalary(PersonDB, StartDate, CompDate, CurRec.CompanyCode);
338
                        break;
339
                }
340

  
341
                // 実行データのキー部年月日は対象月の1日
342
                DateTime ParaDate = new DateTime(CalcEndtDate.Year, CalcEndtDate.Month, 1);
343
                // 支払いデータ書込み
344
                if (!AddOrSetSalary(LedgerExDB
345
                                , CurRec.ConstructionCode, CurRec.GroupCount, CurRec.LineCount, ColPoint, SumSaraly, ParaDate))
346
                {
347
                    return false;
348
                }
349

  
350
                return true;
351
            }
352
            catch (Exception ex)
353
            {
354
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
355
                return false;
356
            }
357
        }
358
        #endregion
359

  
360
        #region 振分無時の給与書込み
361
        /// <summary>
362
        /// 振分無時の給与書込み
363
        /// </summary>
364
        private static bool CalcSalaryDevisionNoting(IOConstructionLedgerExcute LedgerExDB,
365
                                                    ConstructionLedgerDetail CurRec,
366
                                                    DateTime CalcEndtDate,
367
                                                    int ColPoint)
368
        {
369
            try
370
            {
371
                // 実行データのキー部年月日は対象月の1日
372
                DateTime ParaDate = new DateTime(CalcEndtDate.Year, CalcEndtDate.Month, 1);
373
                // 支払いデータ書込み
374
                if (!AddOrSetSalary(LedgerExDB
375
                                , CurRec.ConstructionCode, CurRec.GroupCount, CurRec.LineCount, ColPoint, 0, ParaDate))
376
                {
377
                    return false;
378
                }
379

  
380
                return true;
381
            }
382
            catch (Exception ex)
383
            {
384
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
385
                return false;
386
            }
387
        }
388
        #endregion
389

  
390
        #region 日付指定時の給与書込み
391
        /// <summary>
392
        /// 日付指定時の給与書込み
393
        /// </summary>
394
        private static bool CalcSalaryDevisionDaysInput(IOConstructionLedgerExcute LedgerExDB,
395
                                                        IOMPersonInCharge PersonDB,
396
                                                        ConstructionLedger LedgerRec,
397
                                                        ConstructionLedgerDetail CurRec)
398
        {
399
            try
400
            {
401
                int OneDaySalary = 0;
402

  
403
                // 月末日より月日数を取得する
404
                int MonthDayCnt = DateTimeUtil.EndOfMonth(LedgerRec.ConstructionStart).Day;
405
                // 支払給与計算
406
                switch (CurRec.GroupCount)
407
                {
408
                    case (int)FrmConstructionLedger.DataGroup.Instructor:       // 指導員給料
409
                        OneDaySalary = CommonMotions.cnvRound((double)CommonDefine.InstructorMonthryCost / MonthDayCnt);
410
                        OneDaySalary *= CurRec.SalaryDays;
411
                        break;
412
                    case (int)FrmConstructionLedger.DataGroup.Assistant:        // 副担当者給料
413
                        OneDaySalary = CommonMotions.cnvRound((double)CommonDefine.AssistantMonthryCost / MonthDayCnt);
414
                        OneDaySalary *= CurRec.SalaryDays;
415
                        break;
416
                    case (int)FrmConstructionLedger.DataGroup.Payroll:          // 担当者給料行
417
                        // 給与取得
418
                        OneDaySalary = CommonMotions.CalcElapsedSalary(PersonDB, LedgerRec.ConstructionStart, LedgerRec.ConstructionStart, CurRec.CompanyCode);
419
                        OneDaySalary *= CurRec.SalaryDays;
420
                        break;
421
                }
422

  
423
                // 実行データのキー部年月日は開始月の1日
424
                DateTime ParaDate = new DateTime(LedgerRec.ConstructionStart.Year, LedgerRec.ConstructionStart.Month, 1);
425
                // 台帳カラム位置
426
                int Columncnt = Enum.GetNames(typeof(FrmConstructionLedger.GridColumn)).Length - 1;
427

  
428
                // 支払いデータ書込み
429
                if (!AddOrSetSalary(LedgerExDB
430
                                , CurRec.ConstructionCode, CurRec.GroupCount, CurRec.LineCount, Columncnt, OneDaySalary, ParaDate))
431
                {
432
                    return false;
433
                }
434

  
435
                return true;
436
            }
437
            catch (Exception ex)
438
            {
439
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
440
                return false;
441
            }
442
        }
443
        #endregion
444

  
445
        #region 日次処理での日当の加算を判定する
446
        /// <summary>
447
        /// 日次処理での日当の加算を判定する
448
        /// </summary>
449
        /// <param name="CurRec"></param>
450
        /// <returns></returns>
451
        private static bool CheckPaymentValue(ConstructionLedgerDetail CurRec)
452
        {
453
            IOConstructionLedgerExcute ExcuteDB = new IOConstructionLedgerExcute();
454
            try
455
            {
456
                // 支払いデータより合計金額を取得する
457
                ArrayList arList = new ArrayList();
458
                string ExcuteSQL = "SELECT SUM(PAYMENTAMOUNT) FROM CONSTRUCTIONLEDGEREXCUTE";
459
                ExcuteSQL += string.Format(" WHERE CONSTRUCTIONCODE = {0}", CurRec.ConstructionCode);
460
                ExcuteSQL += string.Format(" AND GROUPCOUNT = {0}", CurRec.GroupCount);
461
                ExcuteSQL += string.Format(" AND LINECOUNT = {0}", CurRec.LineCount);
462
                if (!ExcuteDB.ExecuteReader(ExcuteSQL, ref arList) || arList.Count == 0) return false;
463

  
464
                object[] wrkobj = (object[])arList[0];
465
                int TotalVal = CommonMotions.cnvInt(wrkobj[0]);
466

  
467
                bool bRet = false;
468
                if (TotalVal < CurRec.ExecutionAmount) bRet = true;
469

  
470
                return bRet;
471
            }
472
            catch (Exception ex)
473
            {
474
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
475
                return false;
476
            }
477
        }
478
        #endregion
479

  
480
        #region 詳細台帳に指定金額を設定するか足しこむ
481
        /// <summary>
482
        /// 詳細台帳に指定金額を設定するか足しこむ
483
        /// </summary>
484
        private static bool AddOrSetSalary(IOConstructionLedgerExcute LedgerExDB
485
                                    , int ConstrCode, int GroupCount, int LineCount, int ColumnCount
486
                                    , int DaySalary, DateTime ColumnDate)
487
        {
488
            try
489
            {
490
                // キー作成
491
                string strSQL = LedgerExDB.CreatePrimarykeyString(ConstrCode, GroupCount, LineCount, ColumnCount);
492
                strSQL += string.Format(" AND DATE(TargetMonth) = STR_TO_DATE('{0}','%Y/%m/%d')", ColumnDate.ToShortDateString());
493

  
494
                // データ読込み
495
                List<ConstructionLedgerExcute> LedgerExDBList = new List<ConstructionLedgerExcute>();
496
                ConstructionLedgerExcute LedgerExDBRec = new ConstructionLedgerExcute();
497
                bool ReadData = LedgerExDB.SelectAction(strSQL, ref LedgerExDBList, false);
498
                if (!ReadData || LedgerExDBList.Count == 0)
499
                {
500
                    LedgerExDBRec.ConstructionCode = ConstrCode;	// 工事コード
501
                    LedgerExDBRec.GroupCount = GroupCount;          // グループ番号
502
                    LedgerExDBRec.LineCount = LineCount;            // 行番号
503
                    LedgerExDBRec.ColumnCount = ColumnCount;        // 列番号
504
                    LedgerExDBRec.PaymentAmount = DaySalary;        // 支払金額
505
                    LedgerExDBRec.TargetMonth = ColumnDate;         // 対象年月
506
                    
507
                    // データ作成
508
                    if (!LedgerExDB.InsertAction(LedgerExDBRec, false)) return false;
509
                    
510
                    return true;
511
                }
512

  
513
                // データ更新
514
                if (!LedgerExDB.UpdateFeild(ConstrCode, GroupCount, LineCount, ColumnCount
515
                                            , (int)IOConstructionLedgerExcute.TableColumn.PaymentAmount, DaySalary, false)) return false;
516

  
517
                return true;
518
            }
519
            catch (Exception ex)
520
            {
521
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
522
                return false;
523
            }
524
        }
525
        #endregion
526

  
527
        #region 対象年月から工事詳細台帳のグリッドカラム位置を算出する
528
        /// <summary>
529
        /// 対象年月から工事詳細台帳のグリッドカラム位置を算出する
530
        /// </summary>
531
        /// <param name="TargetMonth"></param>
532
        /// <returns></returns>
533
        public static int CalcTargetMonthToColumn(DateTime StartDate, DateTime TargetMonth)
534
        {
535
            int Columncnt = Enum.GetNames(typeof(FrmConstructionLedger.GridColumn)).Length - 1;
536
            try
537
            {
538
                // 処理対象年月日を対象月月初日に変換する
539
                DateTime NowDates = DateTimeUtil.BeginOfMonth(TargetMonth);
540

  
541
                // 開始年月日を開始年月月初日に変換する
542
                DateTime StartMonth = DateTimeUtil.BeginOfMonth(StartDate);
543

  
544
                // 経過月数を取得する
545
                //TimeSpan ts = NowDates - StartDate;
546
                //int DiffMonth = ts.GetTimeSpanMonths();
547
                int DiffMonth = (TargetMonth.Month + (TargetMonth.Year - StartDate.Year) * 12) - StartDate.Month;
548

  
549
                // 列番号取得
550
                Columncnt += DiffMonth;
551

  
552
                return Columncnt;
553
            }
554
            catch (Exception ex)
555
            {
556
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
557
                return Columncnt;
558
            }
559
        }
560
        #endregion
561

  
562
    }
563
}
branches/src/DataCheckExcute/DataCheckExcute/Common/Process/ClsSystemOnceExecute.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Diagnostics;
4
using System.IO;
5
using System.Linq;
6
using System.Security.Cryptography;
7
using System.Text;
8
using System.Threading.Tasks;
9
using System.Collections;
10

  
11
using log4net;
12
using log4net.Appender;
13
using log4net.Repository.Hierarchy;
14

  
15
using ProcessManagement.Common;
16
using ProcessManagement.DB.IOAccess;
17
using ProcessManagement.DataModel;
18

  
19
namespace ProcessManagement.Common
20
{
21
    /// <summary>
22
    /// システム初回起動時処理クラス
23
    /// </summary>
24
    public class ClsSystemOnceExecute
25
    {
26
        #region 使用定義
27
        //log4netログを使用する
28
        private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
29
        #endregion
30

  
31
        #region 定数
32

  
33
        /// <summary>
34
        /// 非受注へ移す期間(受注できずに見積提出日より以下の日数を過ぎれば非受注へ移動)
35
        /// </summary>
36
        private const int s_NonOrderDay = 93;
37

  
38
        /// <summary>
39
        /// 非受注時メッセージ
40
        /// </summary>
41
        private const string s_NonOrderComment = "受注できずに見積提出日より{0}日を過ぎましたので非受注とします。";
42
        #endregion
43

  
44
        #region 変数
45
        /// <summary>
46
        /// 初期化処理成否フラグ
47
        /// </summary>
48
        private bool m_bExecuteFlg = true;
49
        
50
        /// <summary>
51
        /// 状態毎期限マスタリスト
52
        /// </summary>
53
        private List<TermMasterList> SystemOnceExecuteTermMstList = new List<TermMasterList>();
54

  
55
        /// <summary>
56
        /// 最終起動日
57
        /// </summary>
58
        DateTime m_lastsessionDate = DateTime.MinValue;
59
        #endregion
60

  
61
        #region コンストラクタ
62
        public ClsSystemOnceExecute()
63
        {
64
            // チェック項目取得
65
            if (!GetTermList())
66
            {
67
                m_bExecuteFlg = false;
68
            }
69
        }
70
        #endregion
71

  
72
        #region チェックプロセス
73
        /// <summary>
74
        /// 初期起動チェックプロセス
75
        /// </summary>
76
        /// <returns></returns>
77
        public void FirstExecute()
78
        {
79
            bool ProcessFlg = true;
80
            try
81
            {
82
                // 初期化に失敗したら処理しない
83
                if (!m_bExecuteFlg) return;
84

  
85
                // 本日の初回起動がされている場合は処理しない
86
                if (!ExecuteCheck(ref m_lastsessionDate)) return;
87
                
88
                // 更新済みにするために日付の更新
89
                if (!(ProcessFlg = UpDateTargetDate(DateTime.Now))) return;
90

  
91
                // ----- データチェック
92
                // 資材返却期限のチェックを行う
93
                if (!(ProcessFlg = MaterialLimitCheck(m_lastsessionDate))) return;
94

  
95
                // 日付の期限チェックを行う
96
                if(!(ProcessFlg = SubmittedDateCheck(m_lastsessionDate))) return;
97

  
98
                // 見積有効期限切れを非受注へ移行する
99
                if (!(ProcessFlg = ChangeNonOrdersData())) return;
100

  
101
                // 開始期日がきた給与を適用する
102
                if (!(ProcessFlg = SetNewPayrollCheck())) return;
103

  
104
                // 工事詳細台帳の給与を加算する
105
                if (!(ProcessFlg = CalculateDaysSalary(m_lastsessionDate))) return;
106

  
107
            }
108
            catch (Exception ex)
109
            {
110
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
111
            }
112
            finally
113
            {
114
                // エラー時は元の日付に更新
115
                if (!ProcessFlg) UpDateTargetDate(m_lastsessionDate);
116
            }
117
        }
118
        #endregion
119

  
120
        #region 日付チェック
121
        /// <summary>
122
        /// 初回起動チェック
123
        /// </summary>
124
        /// <returns></returns>
125
        private bool ExecuteCheck(ref DateTime lastsessionDate)
126
        {
127
            IOSystemExecute seDB = new IOSystemExecute();
128
            try
129
            {
130
                // キーを取得する
131
                int PCode = CommonDefine.ExePrimaryCode.First(x => x.Value.Equals("初回起動日付")).Key;
132
                // 日付読込
133
                string strSQL = seDB.CreatePrimarykeyString(PCode);
134
                SystemExecute recordRec = new SystemExecute();
135
                if (!seDB.SelectAction(strSQL, ref recordRec))
136
                {
137
                    // キーセット
138
                    recordRec.PrimaryCode = PCode;
139
                    // 起動日付
140
                    recordRec.TargetDate = DateTime.Now;
141
                    // データがないもしくはエラー時はデータ作成
142
                    if (!seDB.InsertAction(recordRec)) return false;
143
                    // 日付を1日前にする
144
                    recordRec.TargetDate = DateTime.Now.AddDays(-1);
145
                }
146

  
147
                // 前回起動日を取得する
148
                lastsessionDate = recordRec.TargetDate;
149

  
150
                // 日付比較
151
                if (DateTime.Today == recordRec.TargetDate.Date) return false;
152
                
153
                return true;
154
            }
155
            catch (Exception ex)
156
            {
157
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
158
                return false;
159
            }
160
            finally
161
            {
162
                seDB.close(); seDB = null;
163
            }
164
        }
165
        #endregion
166

  
167
        #region 日付変更
168
        /// <summary>
169
        /// 日付変更
170
        /// </summary>
171
        /// <returns></returns>
172
        private bool UpDateTargetDate(DateTime TargetDate)
173
        {
174
            IOSystemExecute seDB = new IOSystemExecute();
175
            try
176
            {
177
                // キーを取得する
178
                int PCode = CommonDefine.ExePrimaryCode.First(x => x.Value.Equals("初回起動日付")).Key;
179

  
180
                // 日付更新
181
                if (!seDB.UpdateFeild(PCode, (int)IOSystemExecute.TableColumn.TargetDate, TargetDate)) return false;
182

  
183
                return true;
184
            }
185
            catch (Exception ex)
186
            {
187
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
188
                return false;
189
            }
190
            finally
191
            {
192
                seDB.close(); seDB = null;
193
            }
194
        }
195
        #endregion
196

  
197
        #region 期限マスタ読込
198
        /// <summary>
199
        /// 期限マスタ読込
200
        /// </summary>
201
        /// <returns></returns>
202
        private bool GetTermList()
203
        {
204
            IOMTerm tmDB = new IOMTerm();
205
            try
206
            {
207
                // 期限マスタ読込
208
                string strSQL = " Order By ConstructionStatusFlg Asc, DisplayOrder Asc";
209
                List<TermMaster> tmList = new List<TermMaster>();
210
                if (!tmDB.SelectAction(strSQL, ref tmList)) return false;
211

  
212
                // ラストのためにループ外で定義
213
                TermMasterList CheckList = null;
214
                int iTmpStatus = -1;
215
                // データセット
216
                foreach (TermMaster tmRec in tmList)
217
                {
218
                    // キーが違えばArrayテーブルへ追加する
219
                    if (iTmpStatus != tmRec.ConstructionStatusFlg)
220
                    {
221
                        // チェックテーブルへ新たな状態テーブルを追加
222
                        CheckList = new TermMasterList();
223
                        SystemOnceExecuteTermMstList.Add(CheckList);
224

  
225
                        // ブレイクキーの更新
226
                        iTmpStatus = tmRec.ConstructionStatusFlg;
227
                    }
228
                    // 取得データをセットする
229
                    CheckList.TermMstTBL.Add(tmRec);
230
                }
231

  
232
                // バッファテーブルが空ではない場合
233
                if (CheckList.TermMstTBL.Count != 0)
234
                {
235
                    // マスターテーブルリストより最後のステータスを取得する
236
                    int SetTableStatus = SystemOnceExecuteTermMstList[SystemOnceExecuteTermMstList.Count - 1].TermMstTBL[0].ConstructionStatusFlg;
237
                    // バッファテーブルのステータスを取得する
238
                    int NowStatus = CheckList.TermMstTBL[0].ConstructionStatusFlg;
239
                    // バッファテーブルがすでにセットされていなければセットする
240
                    if (SetTableStatus != NowStatus) SystemOnceExecuteTermMstList.Add(CheckList);
241
                }
242

  
243
                return true;
244
            }
245
            catch (Exception ex)
246
            {
247
                logger.ErrorFormat("システムエラー:{0}:{1}", CommonMotions.GetMethodName(), ex.Message);
248
                return false;
249
            }
250
            finally
251
            {
252
                tmDB.close(); tmDB = null;
253
            }
254
        }
255
        #endregion
256

  
257
        #region 資材返却ステータス取得処理
258
        /// <summary>
259
        /// 資材返却ステータス取得処理
260
        /// </summary>
261
        /// <returns></returns>
262
        public void MaterualStatusCheck(MaterialRecordInfo checkRec, DateTime CriteriaDate, ref TermMaster TermRec)
263
        {
264
            try
265
            {
266
                // 対象日付を設定
267
                DateTime Target = checkRec.RepayPlanDate;
268

  
269
                TermMaster TermMasterData = new TermMaster();
270

  
271
                // 当日のチェック 今日を基準に対象日と比較する
272
                if (Target.Date == CriteriaDate.Date)
273
                {
274
                    TermMasterData.CheckSchdule = (int)CommonDefine.TermDateCheckTiming.CheckSchdule1;
275
                    TermMasterData.TermDays     = CommonDefine.MaterualStatusCheckList[0].Value;
276
                    TermMasterData.SendTitle    = CommonDefine.MaterualLimitItem[0, 0];
277
                    TermMasterData.SendMessage  = CommonDefine.MaterualLimitItem[0, 1];
278
                    TermMasterData.BackColor    = CommonDefine.MaterualLimitItem[0, 2];
279
                    TermMasterData.ForeColor    = CommonDefine.MaterualLimitItem[0, 3];
280
                }
281
                // 後日以降継続のチェック 今日を基準に経過日(1日)が過ぎているか比較する
282
                if (Target.AddDays(1).Date <= CriteriaDate.Date)
283
                {
284
                    TermMasterData.CheckSchdule = (int)CommonDefine.TermDateCheckTiming.CheckSchdule3;
285
                    TermMasterData.TermDays     = CommonDefine.MaterualStatusCheckList[1].Value;
286
                    TermMasterData.SendTitle    = CommonDefine.MaterualLimitItem[1, 0];
287
                    TermMasterData.SendMessage  = CommonDefine.MaterualLimitItem[1, 1];
288
                    TermMasterData.BackColor    = CommonDefine.MaterualLimitItem[1, 2];
289
                    TermMasterData.ForeColor    = CommonDefine.MaterualLimitItem[1, 3];
290
                }
291

  
292
                TermRec = TermMasterData;
293
            }
294
            catch (Exception ex)
295
            {
296
                logger.ErrorFormat("システムエラー:{0}", ex.Message);
297
            }
298
        }
299
        #endregion
300

  
301
        #region 秘書からのメッセージ作成
302
        /// <summary>
303
        /// 秘書からのメッセージ作成
304
        /// </summary>
305
        private bool MakeSecretaryMassageData(IOMessageBoardData mbdDB,
306
                                        IOMessageBoardTerget mbtDB,
307
                                        IOConstructionBaseInfoDetail cbiDB,
308
                                        MaterialRecordInfo wrkRec, TermMaster CheckRec, DateTime CriteriaDate)
309
        {
310
            try
311
            {
312
                // 工事名称・担当者取得
313
                string strSQL = "SELECT A.DETAILSTRING, C.PERSONCODE CCODE, C.PERSONNAME CNAME";
314
                strSQL += " FROM ConstructionBaseInfo P";
315
                strSQL += string.Format(" LEFT JOIN PERSONINCHARGEMASTER C ON C.PERSONCODE = {0}", wrkRec.PersonCode);
316
                strSQL += " , CONSTRUCTIONBASEINFODETAIL A";
317
                strSQL += string.Format(" WHERE P.CONSTRUCTIONCODE = {0}", wrkRec.ConstructionCode);
318
                strSQL += string.Format(" AND A.CONSTRUCTIONCODE = P.CONSTRUCTIONCODE AND A.DETAILNO = {0}", (int)ConstructionBaseInfoDetail.DetailDataNo.ConstructionName);
319
                ArrayList arList = new ArrayList();
320
                if (!cbiDB.ExecuteReader(strSQL, ref arList)) return false;
321

  
322
                string DetailString = string.Empty;
323
                //int SalesPersonCode = 0;
324
                string SalesPersonName = string.Empty;
325
                int ConstructionPersonCode = 0;
326
                string ConstructionPersonName = string.Empty;
327
                foreach (object[] onjwrk in arList)
328
                {
329
                    DetailString = CommonMotions.cnvString(onjwrk[0]);
330
                    ConstructionPersonCode = CommonMotions.cnvInt(onjwrk[1]);
331
                    ConstructionPersonName = CommonMotions.cnvString(onjwrk[2]);
332
                    break;
333
                }
334

  
335
                // 新規メッセージ作成
336
                MessageBoardData WriteData = new MessageBoardData();
337
                List<MessageBoardTerget> WriteDetail = new List<MessageBoardTerget>();
338

  
339
                // 掲示板メッセージ
340
                WriteData.FromCode = CommonDefine.s_MsgBoardSystemCode;	                                    // 書込み者コード
341
                WriteData.FromName = string.Format(CommonDefine.s_MsgBoardSystemNameFormat, "秘書");        // 書込み者名
342

  
343
                WriteData.MessageTitle = CheckRec.SendTitle;                                                // 伝言タイトル
344

  
345
                // リンク情報
346
                WriteData.LinkType = (int)CommonDefine.LinkType.ConstructionInfo;
347
                WriteData.LinkMessage = string.Format("工事番号:{0} 工事名称:{1}"
348
                                                                            , CommonMotions.cnvStringCodeFromInt(wrkRec.ConstructionCode, "-", 8)
349
                                                                            , DetailString);
350
                WriteData.LinkCode = string.Format("{0}", CommonMotions.cnvStringCodeFromInt(wrkRec.ConstructionCode, "-", 8));
351

  
352
                // 伝言内容
353
                WriteData.MessageContent = CheckRec.SendMessage;
354

  
355

  
356
                //WriteData.WritingDate = DateTime.Now;	                                                    // 書込み日付
357
                WriteData.WritingDate = CriteriaDate.Date + DateTime.Now.TimeOfDay;	                        // 書込み日付
358
                WriteData.PersonCode = CommonDefine.s_MsgBoardSystemCode;	                                // 書込み担当者コード
359
                WriteData.ShareFlag = 1;	                                                                // 管理者対象フラグ
360

  
361
                WriteData.BackColor = CheckRec.BackColor;                                                   // 背景色セット
362
                WriteData.MessageColor = CheckRec.ForeColor;                                                // 背景色セット
363

  
364
                // 掲示板対象者テーブル
365
                MessageBoardTerget DetailTbl = new MessageBoardTerget();
366
                DetailTbl.ToCode = ConstructionPersonCode;                                                  // 対象者コード
367
                DetailTbl.ToName = ConstructionPersonName;	                                                // 対象者
368
                WriteDetail.Add(DetailTbl);
369

  
370
                // メッセージフラグを自動に設定する
371
                WriteData.MessageFlag = (int)CommonDefine.MessageFlg.Secretary;
372

  
373
                // 掲示板へメッセージを載せる
374
                if (!ClsMessageBoradAccess.CreateMessage(mbdDB, mbtDB, WriteData, WriteDetail)) return false;
375

  
376
                return true;
377
            }
378
            catch (Exception ex)
379
            {
380
                logger.ErrorFormat("システムエラー:{0}", ex.Message);
381
                return false;
382
            }
383
        }
384
        #endregion
385

  
386
        #region 資材返却期限チェック処理
387
        /// <summary>
388
        /// チェック処理
389
        /// </summary>
390
        /// <returns></returns>
391
        public bool MaterialLimitCheck(DateTime StartDate)
392
        {
393
            IOConstructionBaseInfo cbiDB = new IOConstructionBaseInfo();
394
            IOConstructionBaseInfoDetail cbiDDB = new IOConstructionBaseInfoDetail();
395
            IOMessageBoardData mbdDB = new IOMessageBoardData();
396
            IOMessageBoardTerget mbtDB = new IOMessageBoardTerget();
397

  
398
            string strSQL = "SELECT";
399
            strSQL += " t1.MaterialItemCode";
400
            strSQL += ", t1.ProcessDate";
401
            strSQL += ", t1.SeqNo";
402
            strSQL += ", t1.RecKind";
403
            strSQL += ", t1.ConstructionCode";
404
            strSQL += ", t1.PersonCode";
405
            strSQL += ", t1.MaterialCount";
406
            strSQL += ", MAX(t1.REPAYPLANDATE) AS RepayPlanDate";
407
            strSQL += ", t1.CommentText";
408
            strSQL += ", t1.EntryDate";
409
            strSQL += ", t1.UpdateDate";
410
            strSQL += " FROM";
411
            strSQL += " MATERIALRECORDINFO AS t1";
412
            strSQL += " INNER JOIN CONSTRUCTIONMATERIALINFO AS t2";
413
            strSQL += " ON t1.CONSTRUCTIONCODE = t2.CONSTRUCTIONCODE";
414
            strSQL += " AND t1.MATERIALITEMCODE = t2.MATERIALITEMCODE";
415
            strSQL += " AND t2.COMPLETEFLG = 0";
416
            strSQL += " WHERE";
417
            strSQL += " t1.CONSTRUCTIONCODE > 0";
418
            strSQL += " AND t1.CONSTRUCTIONCODE IS NOT NULL";
419
            strSQL += " AND t1.RECKIND = 0";
420
            strSQL += " AND t1.REPAYPLANDATE <= DATE_FORMAT(NOW(), '%Y/%m/%d')";
421
            strSQL += " GROUP BY";
422
            strSQL += " t1.CONSTRUCTIONCODE";
423
            strSQL += ", t1.PERSONCODE";
424
            strSQL += " ORDER BY";
425
            strSQL += " t1.CONSTRUCTIONCODE";
426
            strSQL += " , t1.REPAYPLANDATE";
427

  
428
            try
429
            {
430
                cbiDB.connect(); cbiDB.beginTran();
431
                cbiDDB.connect(); cbiDDB.beginTran();
432
                mbdDB.connect(); mbdDB.beginTran();
433
                mbtDB.connect(); mbtDB.beginTran();
434

  
435
                bool procflg = true;
436

  
437
                // 資材履歴情報の返却未完了の貸出データを取得する
438
                IOMaterialRecordInfo mrDB = new IOMaterialRecordInfo();
439
                ArrayList mrData = new ArrayList();
440
                List<MaterialRecordInfo> data = new List<MaterialRecordInfo>();
441

  
442
                if (mrDB.ExecuteReader(strSQL, ref mrData))
443
                {
444
                    foreach (object[] objwrk in mrData)
445
                    {
446
                        MaterialRecordInfo wrkRec = new MaterialRecordInfo();
447
                        mrDB.Reader2Struct(objwrk, ref wrkRec);
448
                        // チェック
449
                        TermMaster term = new TermMaster();
450
                        MaterualStatusCheck(wrkRec, StartDate, ref term);
451

  
452
                        // メッセージ作成 掲示板にメッセージを載せる処理
453
                        if (!MakeSecretaryMassageData(mbdDB, mbtDB, cbiDDB, wrkRec, term, StartDate))
454
                        {
455
                            procflg = false;
456
                            break;
457
                        }
458
                    }
459

  
460
                    if (procflg)
461
                    {
462
                        cbiDB.commit();
463
                        cbiDDB.commit();
464
                        mbdDB.commit();
465
                        mbtDB.commit();
466
                    }
467
                    else
468
                    {
469
                        cbiDB.rollback();
470
                        cbiDDB.rollback();
471
                        mbdDB.rollback();
472
                        mbtDB.rollback();
473
                    }
474

  
475
                    return procflg;
476
                }
477
            }
478
            catch (Exception ex)
479
            {
480
                logger.ErrorFormat("システムエラー:{0}", ex.Message);
481
                return false;
482
            }
483
            finally
484
            {
485
                cbiDB.close(); cbiDB = null;
486
                cbiDDB.close(); cbiDDB = null;
487
                mbdDB.close(); mbdDB = null;
488
                mbtDB.close(); mbtDB = null;
489
            }
490
            return true;
491
        }
492
        #endregion
493

  
494
        #region 工事情報チェック処理
495
        /// <summary>
496
        /// 日付の期限チェックを行う
497
        /// </summary>
498
        private bool SubmittedDateCheck(DateTime StartDate)
499
        {
500
            IOConstructionBaseInfo cbiDB = new IOConstructionBaseInfo();
501
            IOConstructionBaseInfoDetail cbiDDB = new IOConstructionBaseInfoDetail();
502
            IOMessageBoardData mbdDB = new IOMessageBoardData();
503
            IOMessageBoardTerget mbtDB = new IOMessageBoardTerget();
504
            try
505
            {
506
                // 工事基本情報を期限テーブルに設定している状態分取得する
507
                string strSQL = " WHERE CONSTRUCTIONSTATUSFLG IN (SELECT DISTINCT A1.CONSTRUCTIONSTATUSFLG FROM TERMMASTER A1)";
508
                strSQL = " ORDER BY CONSTRUCTIONSTATUSFLG ASC, CONSTRUCTIONCODE ASC";
509
                List<ConstructionBaseInfo> cbiList = new List<ConstructionBaseInfo>();
510
                if (!cbiDB.SelectAction(strSQL, ref cbiList)) return true;
511

  
512
                // 経過日数を取得する
513
                TimeSpan ts = DateTime.Now - StartDate;
514
                int diffDays = ts.Days;
515
                // チェック範囲が10日を超えたら当日だけチェックする
516
                if (diffDays > 10)
517
                {
518
                    diffDays = 1;
519
                    StartDate = DateTime.Now.AddDays(-1);
520
                }
521

  
522
                cbiDB.connect(); cbiDB.beginTran();
523
                cbiDDB.connect(); cbiDDB.beginTran();
524
                mbdDB.connect(); mbdDB.beginTran();
525
                mbtDB.connect(); mbtDB.beginTran();
526

  
527
                bool procflg = true;
528
                // 経過日数分処理を行う
529
                for (int ix = 0; ix < diffDays; ix++)
530
                {
531
                    DateTime CriteriaDate = StartDate.AddDays((ix + 1));
532
                    foreach (ConstructionBaseInfo wrkRec in cbiList)
533
                    {
534
                        List<TermMaster> term = new List<TermMaster>();
535
                        // 増減工事の子は処理しない
536
                        if (wrkRec.TyingFlg == (int)CommonDefine.BaseInfoTyingFlg.Tying) continue;
537
                        // 結合工事の親は処理しない
538
                        if (wrkRec.JoinFlg == (int)CommonDefine.BaseInfoJoinFlg.JoinParent) continue;
539
                        // 結合工事の子は処理しない
540
                        if (wrkRec.JoinFlg == (int)CommonDefine.BaseInfoJoinFlg.JoinChildren) continue;
541
                        // チェックOKならば次のデータ
542
                        if (ConstructionStatusCheck(wrkRec, CriteriaDate, ref term)) continue;
543

  
544
                        // 掲示板にメッセージを載せるためにループ処理
545
                        foreach (TermMaster CurTerm in term)
546
                        {
547
                            // メッセージ作成
548
                            if (!MakeMassageData(mbdDB, mbtDB, cbiDDB, wrkRec, CurTerm, CriteriaDate))
549
                            {   // エラー時に抜ける
550
                                procflg = false;
551
                                break;
552
                            }
553
                        }
554
                        if (!procflg) break;
555
                    }
556
                    if (!procflg) break;
557
                }
558

  
559
                if (!procflg)
560
                {
561
                    cbiDB.rollback();
562
                    cbiDDB.rollback();
563
                    mbdDB.rollback();
564
                    mbtDB.rollback();
565
                }
566

  
567
                return procflg;
568
            }
569
            catch (Exception ex)
570
            {
571
                logger.ErrorFormat("システムエラー:{0}", ex.Message);
572
                return false;
573
            }
574
            finally
575
            {
576
                cbiDB.commit();
577
                cbiDDB.commit();
578
                mbdDB.commit();
579
                mbtDB.commit();
580

  
581
                cbiDB.close(); cbiDB = null;
582
                cbiDDB.close(); cbiDDB = null;
583
                mbdDB.close(); mbdDB = null;
584
                mbtDB.close(); mbtDB = null;
585
            }
586
        }
587
        #endregion
588

  
589
        #region チェック処理
590
        /// <summary>
591
        /// チェック処理
592
        /// </summary>
593
        /// <returns></returns>
594
        public bool ConstructionStatusCheck(ConstructionBaseInfo checkRec, DateTime CriteriaDate, ref List<TermMaster> TermRec)
595
        {
596
            try
597
            {
598
                // 初期化に失敗していたら処理しない
599
                if (!m_bExecuteFlg) return true;
600

  
601
                // 取得データの進捗状態がチェック判定テーブルにあるかの存在チェック
602
                bool exestFlg = false;
603
                int itblCnt = 0;
604
                for (int i = 0; i < SystemOnceExecuteTermMstList.Count; i++)
605
                {
606
                    // 判定対象データの状態がチェック判定テーブルにあれば処理をおこなう
607
                    if (SystemOnceExecuteTermMstList[i].TermMstTBL[0].ConstructionStatusFlg == checkRec.ConstructionStatusFlg)
608
                    {
609
                        exestFlg = true;
610
                        itblCnt = i;
611
                        break;
612
                    }
613
                }
614
                // 取得データがチェック判定以外は処理しない
615
                if (!exestFlg) return true;
616

  
617
                // 戻り値
618
                bool bCheckNoError = true;
619

  
620
                List<TermMaster> Termtbl = SystemOnceExecuteTermMstList[itblCnt].TermMstTBL;
621
                // エラーチェック
622
                foreach (TermMaster wrkCheck in Termtbl)
623
                {
624
                    // 対象日付をクリア
625
                    DateTime Target = DateTime.MinValue;
626

  
627
                    switch (wrkCheck.FieldNo)
628
                    {
629
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.RequestedDate:               // 依頼受け日
630
                            Target = checkRec.RequestedDate;
631
                            break;
632
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.EstimatesSubmitDeadline:     // 見積提出期限
633
                            Target = checkRec.EstimatesSubmitDeadline;
634
                            break;
635
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.EstimatesSubmittedDate:      // 見積提出日
636
                            Target = checkRec.EstimatesSubmittedDate;
637
                            break;
638
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.OrderDate:                   // 受注日
639
                            Target = checkRec.OrderDate;
640
                            break;
641
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.OrderStartingDate:           // 開始予定日
642
                            Target = checkRec.OrderStartingDate;
643
                            break;
644
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.OrderCompletionDate:         // 完了予定日
645
                            Target = checkRec.OrderCompletionDate;
646
                            break;
647
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.ConstrPreparationDate:       // 施工開始準備日
648
                            Target = checkRec.PreparationStartDate;
649
                            break;
650
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.ConstructionStartingDate:    // 施工開始日
651
                            Target = checkRec.ConstructionStartingDate;
652
                            break;
653
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.ConstructionCompletionDate:  // 施工完了日
654
                            Target = checkRec.ConstructionCompletionDate;
655
                            break;
656
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.TransferConstructionDate:    // 工事移管日
657
                            Target = checkRec.TransferConstructionDate;
658
                            break;
659
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.EstimatesExpirationDate:     // 見積有効期限
660
                            Target = checkRec.EstimatesExpirationDate;
661
                            break;
662
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.ConstructionPeriodStart:     // 契約工期開始
663
                            Target = checkRec.ConstructionPeriodStart;
664
                            break;
665
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.ConstructionPeriodEnd:       // 契約工期完了
666
                            Target = checkRec.ConstructionPeriodEnd;
667
                            // 延長工期があれば延長工期を入れる
668
                            if (checkRec.ConstructionPeriodEnd2 != DateTime.MinValue) Target = checkRec.ConstructionPeriodEnd2;
669
                            break;
670
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.BillingStartDate:            // 請求準備開始日
671
                            Target = checkRec.BillingStartDate;
672
                            break;
673
                        case (int)CommonDefine.ConstructionBaseInfo_DateNo.BillingDate:                 // 請求日
674
                            Target = checkRec.BillingDate;
675
                            // 2016/10/06 台帳入力完了日があればチェックをしない 
676
                            if (checkRec.LedgerComplateDate != DateTime.MinValue) Target = DateTime.MinValue.Date;
677
                            break;
678
                    }
679
                    // 未定の日付はチェックしない
680
                    if (Target.Date == DateTime.MinValue.Date) continue;
681

  
682

  
683
                    // エラーフラグクリア
684
                    bool ErrFlg = false;
685

  
686
                    switch (wrkCheck.CheckSchdule)
687
                    {
688
                        case (int)CommonDefine.TermDateCheckTiming.CheckSchdule0:   // 前日以前のチェック
689
                            // 今日を基準に経過日を加算して対象日と比較する
690
                            //if (Target.Date == DateTime.Now.AddDays(wrkCheck.TermDays).Date)
691
                            if (Target.Date == CriteriaDate.AddDays(wrkCheck.TermDays).Date)
692
                            {
693
                                ErrFlg = true;
694
                            }
695
                            break;
696
                        case (int)CommonDefine.TermDateCheckTiming.CheckSchdule1:   // 当日のチェック
697
                            // 今日を基準に対象日と比較する
698
                            //if (Target.Date == DateTime.Now.Date)
699
                            if (Target.Date == CriteriaDate.Date)
700
                            {
701
                                ErrFlg = true;
702
                            }
703
                            break;
704
                        case (int)CommonDefine.TermDateCheckTiming.CheckSchdule2:   // 後日以降のチェック
705
                            // 今日を基準に対象日と比較する
706
                            //if (Target.AddDays(wrkCheck.TermDays).Date == DateTime.Now.Date)
707
                            if (Target.AddDays(wrkCheck.TermDays).Date == CriteriaDate.Date)
708
                            {
709
                                ErrFlg = true;
710
                            }
711
                            break;
712
                        case (int)CommonDefine.TermDateCheckTiming.CheckSchdule3:   // 後日以降継続のチェック
713
                            // 今日を基準に経過日が過ぎているとエラー
714
                            //if (Target.AddDays(wrkCheck.TermDays).Date <= DateTime.Now.Date)
715
                            if (Target.AddDays(wrkCheck.TermDays).Date <= CriteriaDate.Date)
716
                            {
717
                                ErrFlg = true;
718
                            }
719
                            break;
720
                    }
721
                    // チェック項目に該当すればメッセージ・色をセットする
722
                    if (ErrFlg)
723
                    {
724
                        TermRec.Add(wrkCheck);
725
                        bCheckNoError = false;
726
                    }
727
                }
728
                return bCheckNoError;
729
            }
730
            catch (Exception ex)
731
            {
732
                logger.ErrorFormat("システムエラー:{0}", ex.Message);
733
                return false;
734
            }
735
        }
736
        #endregion
737

  
738
        #region 掲示板メッセージ作成
739
        /// <summary>
740
        /// メッセージ作成
741
        /// </summary>
742
        private bool MakeMassageData(IOMessageBoardData mbdDB,
743
                                        IOMessageBoardTerget mbtDB,
744
                                        IOConstructionBaseInfoDetail cbiDB,
745
                                        ConstructionBaseInfo wrkRec, TermMaster CheckRec, DateTime CriteriaDate)
746
        {
747
            try
748
            {
749
                // 工事名称・営業担当者・工事担当者取得
750
                string strSQL = "SELECT A.DETAILSTRING, B.PERSONCODE SCODE, B.PERSONNAME SNAME, C.PERSONCODE CCODE, C.PERSONNAME CNAME";
751
                strSQL += " FROM CONSTRUCTIONBASEINFO P";
752
                strSQL += " LEFT JOIN PERSONINCHARGEMASTER B ON B.PERSONCODE = P.SALESPERSONCODE";
753
                strSQL += " LEFT JOIN PERSONINCHARGEMASTER C ON C.PERSONCODE = P.CONSTRUCTIONPERSONCODE";
754
                strSQL += " , CONSTRUCTIONBASEINFODETAIL A";
755
                strSQL += string.Format(" WHERE P.CONSTRUCTIONCODE = {0}",wrkRec.ConstructionCode);
756
                strSQL += string.Format(" AND A.CONSTRUCTIONCODE = P.CONSTRUCTIONCODE AND A.DETAILNO = {0}", (int)ConstructionBaseInfoDetail.DetailDataNo.ConstructionName);
757
                ArrayList arList = new ArrayList();
758
                if (!cbiDB.ExecuteReader(strSQL, ref arList)) return false;
759
                
760
                string DetailString = string.Empty;
761
                int SalesPersonCode = 0;
762
                string SalesPersonName = string.Empty;
763
                int ConstructionPersonCode = 0;
764
                string ConstructionPersonName = string.Empty;
765
                foreach (object[] onjwrk in arList)
766
                {
767
                    DetailString = CommonMotions.cnvString(onjwrk[0]);
768
                    SalesPersonCode = CommonMotions.cnvInt(onjwrk[1]);
769
                    SalesPersonName = CommonMotions.cnvString(onjwrk[2]);
770
                    ConstructionPersonCode = CommonMotions.cnvInt(onjwrk[3]);
771
                    ConstructionPersonName = CommonMotions.cnvString(onjwrk[4]);
772
                    break;
773
                }
774

  
775
                // 新規メッセージ作成
776
                MessageBoardData WriteData = new MessageBoardData();
777
                List<MessageBoardTerget> WriteDetail = new List<MessageBoardTerget>();
778

  
779
                // 掲示板メッセージ
780
                WriteData.FromCode = CommonDefine.s_MsgBoardSystemCode;	                                    // 書込み者コード
781
                WriteData.FromName = string.Format(CommonDefine.s_MsgBoardSystemNameFormat, "秘書");          // 書込み者名
782

  
783
                WriteData.MessageTitle = CheckRec.SendTitle;                                              // 伝言タイトル
784

  
785
                // リンク情報
786
                WriteData.LinkType = (int)CommonDefine.LinkType.ConstructionInfo;
787
                WriteData.LinkMessage = string.Format("工事番号:{0} 工事名称:{1}"
788
                                                                            , CommonMotions.cnvStringCodeFromInt(wrkRec.ConstructionCode, "-", 8)
789
                                                                            , DetailString);
790
                WriteData.LinkCode = string.Format("{0}", CommonMotions.cnvStringCodeFromInt(wrkRec.ConstructionCode, "-", 8));
791

  
792
                // 伝言内容
793
                WriteData.MessageContent = CheckRec.SendMessage;
794

  
795

  
796
                //WriteData.WritingDate = DateTime.Now;	                                                    // 書込み日付
797
                WriteData.WritingDate = CriteriaDate.Date + DateTime.Now.TimeOfDay;	                        // 書込み日付
798
                WriteData.PersonCode = CommonDefine.s_MsgBoardSystemCode;	                                // 書込み担当者コード
799
                WriteData.ShareFlag = 1;	                                                                // 管理者対象フラグ
800

  
801
                WriteData.BackColor = CheckRec.BackColor;                                                   // 背景色セット
802
                WriteData.MessageColor = CheckRec.ForeColor;                                                // 背景色セット
803

  
804
                // 掲示板対象者テーブル
805
                MessageBoardTerget DetailTbl = new MessageBoardTerget();
806
                DetailTbl.ToCode = SalesPersonCode;                                                     // 対象者コード
807
                DetailTbl.ToName = SalesPersonName;	                                                    // 対象者
808
                if (ConstructionPersonCode != 0)
809
                {
810
                    DetailTbl.ToCode = ConstructionPersonCode;                                          // 対象者コード
811
                    DetailTbl.ToName = ConstructionPersonName;	                                        // 対象者
812
                }
813
                WriteDetail.Add(DetailTbl);
814

  
815
                // メッセージフラグを自動に設定する
816
                WriteData.MessageFlag = (int)CommonDefine.MessageFlg.Secretary;
817

  
818
                // 掲示板へメッセージを載せる
819
                if (!ClsMessageBoradAccess.CreateMessage(mbdDB, mbtDB, WriteData, WriteDetail)) return false;
820

  
821
                return true;
822
            }
823
            catch (Exception ex)
824
            {
825
                logger.ErrorFormat("システムエラー:{0}", ex.Message);
826
                return false;
827
            }
828
        }
829
        #endregion
830

  
831
        #region 見積有効期限が経過したデータを非受注へ変更する
832
        /// <summary>
833
        /// 見積有効期限が経過したデータを非受注へ変更する
834
        /// </summary>
835
        private bool ChangeNonOrdersData()
836
        {
837
            IOConstructionBaseInfo BaseDB = new IOConstructionBaseInfo();
838
            IOConstructionBaseInfoDetail DetailDB = new IOConstructionBaseInfoDetail();
839
            try
840
            {
841
                int iCode1 = CommonDefine.ProjectsStatus.First(x => x.Value.Equals("非 受 注")).Key;
842
                int iCode2 = CommonDefine.ProjectsStatus.First(x => x.Value.Equals("依頼受け中")).Key;
843
                int iCode3 = CommonDefine.ProjectsStatus.First(x => x.Value.Equals("見積提出")).Key;
844

  
845
                // 対象データが存在するかを確認する
846
                string strSQL = "SELECT A.CONSTRUCTIONCODE, B.DETAILSTRING FROM CONSTRUCTIONBASEINFO A";
847
                strSQL += " LEFT JOIN CONSTRUCTIONBASEINFODETAIL B ON B.CONSTRUCTIONCODE = A.CONSTRUCTIONCODE";
848
                strSQL += string.Format(" AND B.DETAILNO = {0}", (int)ConstructionBaseInfoDetail.DetailDataNo.OrdersDecisionComment);
849

  
850
                string strWHERE = " WHERE DATE(A.ESTIMATESSUBMITTEDDATE) != STR_TO_DATE('0001/01/01', '%Y/%m/%d')";
851
                strWHERE += string.Format(" AND DATE(DATE_ADD(ESTIMATESSUBMITTEDDATE, INTERVAL '{0}' DAY))", s_NonOrderDay);
852
                strWHERE += string.Format(" < STR_TO_DATE('{0}','%Y/%m/%d')", DateTime.Now.ToShortDateString());
853
                strWHERE += string.Format(" AND A.CONSTRUCTIONSTATUSFLG IN({0}, {1})", iCode2, iCode3);
854
                strWHERE += string.Format(" AND A.ESTIMATETYPE IN ({0}, {1})", (int)CommonDefine.BaseInfoEstimateType.Normal, (int)CommonDefine.BaseInfoEstimateType.GetBudget);
855
                strSQL += strWHERE;
856
                ArrayList arList = new ArrayList();
857
                if (!BaseDB.ExecuteReader(strSQL, ref arList))
858
                {
859
                    logger.ErrorFormat("工事基本情報読込エラー 非受注案件移行処理失敗:{0}:{1}", CommonMotions.GetMethodName(), strSQL);
860
                    return false;
861
                }
862
                // ----- 対象データが存在しなければ抜ける
863
                if (arList.Count == 0) return true;
864

  
865
                // ----- 対象データが存在すれば更新する
866
                BaseDB.connect(); BaseDB.beginTran();
867
                DetailDB.connect(); DetailDB.beginTran();
868

  
869
                // 工事基本情報データ
870
                strSQL = string.Format("UPDATE CONSTRUCTIONBASEINFO A SET A.CONSTRUCTIONSTATUSFLG = {0},", iCode1);
871
                strSQL += string.Format(" A.NONORDERDATE = STR_TO_DATE('{0}','%Y/%m/%d')", DateTime.Today.ToShortDateString());
872
                strSQL += strWHERE;
... 差分の行数が表示可能な上限を超えました。超過分は表示しません。

他の形式にエクスポート: Unified diff