package kintai;

=pod

=head1 NAME

kintai.pm - 勤怠データ集計

=cut

use Jcode;

#------------------------------------------------------------------
sub new {
#------------------------------------------------------------------

=head2 勤怠データ集計の初期設定 [new]

	(kin501.cgi)
	my $kintaiSyukei = kintai->new({'dbh'=>$dbh,				# 共通サブルーチン
					'date'=>$in->param('hiduke'),		# 基準日（終了日）
					'pca'=>$pca,				# ドリーム用サブルーチン
					kinmuMaster=>$kinmuMaster,		# 勤務名称マスタ全件
					action=>'月例'});			# 処理指定　月例 or 昇給

=cut

	my $class = shift;
	my $self = {};
	$self->{'dbh'} = shift;
	bless $self,$class;
	$self->initialize();
	return  $self ;
}
sub initialize{
	my $s = shift;

	# 超過時間の区切りデータを取得する。
	my $sth = $s->{'dbh'}->{'dbh'}->{'dbh'}->prepare("
		select * from 超過時間設定マスタ 
		where ? between 適用開始日 and subdate(NEXT適用日,interval 1 day)
		order by 超過時間 desc
		");
	my $ref;
	$sth->execute($s->{'dbh'}->{'date'});
	$s->{'ruikeiJikan'} = [];
	while ($ref = $sth->fetchrow_hashref()){
		$ref->{'超過時間'} = $s->{'dbh'}->{'dbh'}->hm2m($ref->{'超過時間'});
		push(@{$s->{'ruikeiJikan'}},$ref);
		
	}

	# 計算基礎時間マスタを取得する。
	$sth = $s->{'dbh'}->{'dbh'}->{'dbh'}->prepare("
		select * from 計算基礎時間マスタ 
		where ? between 適用開始日 and subdate(NEXT適用日,interval 1 day)
		");
	$ref;
	$sth->execute($s->{'dbh'}->{'date'});
	$s->{'計算基礎時間マスタ'} = {};
	while ($ref = $sth->fetchrow_hashref()){
		$s->{'計算基礎時間マスタ'}->{$ref->{'計算基礎時間区分'}} = $ref;
		
	}

	# ドリームの処理テーブルを切り分ける。				
	if($s->{dbh}->{action} eq '月例'){
		$s->{table_zangyou} = 'T月例処理用残業集計データ';
		$s->{table_kintai} = 'T月例処理用勤怠集計データ';
	}else{
		$s->{table_zangyou} = 'T昇給処理用残業集計データ';
		$s->{table_kintai} = 'T昇給処理用勤怠集計データ';
	}
	$s->{'dbh'}->{'pca'}->{dbh}->do($s->{dbh}->{pca}->euc2sj("delete from $s->{table_zangyou}"));
	$s->{'dbh'}->{'pca'}->{dbh}->do($s->{dbh}->{pca}->euc2sj("delete from $s->{table_kintai}"));
	
}
sub Start{

=head2 勤怠データ集計値のクリアを行う [Start]

	(kin501.cgi)
	$kintaiSyukei->Start({syoteijikan=>$syoteijikan,			# 所定時間に足りない分数
				mibun=>$mibun});				# 身分区分 (1:社員、2:定準、3:パート)
					action=>'月例'});			# 処理指定　月例 or 昇給

=cut

	my $s = shift;
	$s->{init} = shift;
	$s->{'T月例処理用勤怠集計データ'} = {};
	$s->{'T月例処理用残業集計データ'} = {};
	$s->{Sum_zangyou} = 0;
	$s->{todokebi} = 0;
	return $s;
}
sub Sumry{

=head2 累計残業時間別勤務区分別に残業時間、休日時間をサマリする [Sumry]

	(kin501.cgi)
	$kintaiSyukei->Sumry($ref2,						# 届データ１件
				{kinmu=>$kinmu->{$ymd}});			# 勤務区分

=cut

	my $s = shift;
	my $ref = shift;
	my $arg = shift;
	my $kinmu;

	# 残業、廃休以外の届データは処理しない。
	if(grep {$ref->{'届コード'} eq $_} qw(70 71 74 75)){		# 70:残業、71:廃休、74:代出(日)、75:代出(時間）
	}
	else{
		return;
	}

	my ($jikan,$jikan2,$jikan3)=(0,0,0);
	$jikan = $s->{dbh}->{dbh}->hm2m($ref->{'時間'}/100);	# hhmmを分単位にする
	if($ref->{'届コード'} eq '70'){				# 70:残業
		$s->{'超過種類'} = '1';
		$kinmu = $arg->{'kinmu'};
		if($jikan <= $s->{init}->{syoteijikan}){	# １日の所定時間内の残業は加算しない
			return;
		}else{						# hhmmを分単位にする
			$jikan -= $s->{init}->{syoteijikan};
		}
	}
	elsif($ref->{'届コード'} eq '71'){			# 71:廃休
		$s->{'超過種類'} = '2';
		$kinmu = $ref->{'勤務コード'};
	}
	elsif($ref->{'届コード'} eq '75'){			# 75:代出（時間）
		$s->{'超過種類'} = '3';
		$kinmu = $ref->{'勤務コード'};
	}
	else{							# 74:代出（日）
		$s->{'超過種類'} = '3';
		$kinmu = $ref->{'勤務コード'};
		if($kinmu eq ''){
			$kinmu = 'H';
		}
		$jikan = $s->{dbh}->{kinmuMaster}->{$kinmu}->{'労働時間'}
			- $s->{init}->{syoteijikan};
	}

	if($kinmu eq ''){
		$kinmu = 'H';
	}

	# 累計時間の区切り単位に残業時間を集計する。
	#   区切り時間の多いほうから処理を行う。 		ex. [ 60, 40, 0 ]
	for(@{$s->{ruikeiJikan}}){
		# 区切り時間を越えている時間を時間を集計する。
		if($_->{'超過時間'} < $s->{Sum_zangyou} + $jikan){
			$jikan2 = $s->{Sum_zangyou} + $jikan - $_->{'超過時間'};	
			$jikan2 = $jikan2 < $jikan ? $jikan2 : $jikan ;
			# 超過種類別超過時間別に残業時間を集計する。
			if($arg->{Skip} ne 'ON'){
				$s->{'T月例処理用残業集計データ'}->{$s->{'超過種類'}}->{$_->{'超過時間コード'}}->
					{$kinmu} += $jikan2;
			}
			$jikan -= $jikan2;
			$jikan3 += $jikan2;
		}
	}
	$s->{Sum_zangyou} += $jikan3;
}
sub zangyou_put{
	my $s = shift;
	my $ref = shift;

	my $sth = $s->{'dbh'}->{'dbh'}->{'dbh'}->prepare("
		select m.*,a.割増率 from 割増率設定マスタ m
		inner join 割増率マスタ a on
			(a.割増率コード = m.割増率コード
			and ? between a.適用開始日 and subdate(a.NEXT適用日,interval 1 day))
		where m.身分コード = ?
		and m.超過種類 = ?
		and m.超過時間コード = ?
		and ? between m.適用開始日 and subdate(m.NEXT適用日,interval 1 day)
		");
	my $r2;
	my $sth3 = $s->{'dbh'}->{'dbh'}->{'dbh'}->prepare("
		select m.*,a.割増率 from 個人別割増率設定マスタ m
		inner join 割増率マスタ a on
			(a.割増率コード = m.割増率コード
			and ? between a.適用開始日 and subdate(a.NEXT適用日,interval 1 day))
		where m.氏名コード = ?
		and m.超過種類 = ?
		and m.超過時間コード = ?
		and ? between m.適用開始日 and subdate(m.NEXT適用日,interval 1 day)
		");
	my $r3;
	my $r = {};
	SYURUI:
	for (keys %{$s->{'T月例処理用残業集計データ'}}){
		$r->{'超過種類'} = $_;
		CHOUKAJIKAN:
		for (keys %{$s->{'T月例処理用残業集計データ'}->{$r->{'超過種類'}}}){
			$r->{'超過時間コード'} = $_;
			KINMUKOUDO:
			for (keys %{$s->{'T月例処理用残業集計データ'}->{$r->{'超過種類'}}
										->{$r->{'超過時間コード'}}}){
				$r->{'勤務コード'} = $_;
				next KINMUKOUDO if($s->{'T月例処理用残業集計データ'}->{$r->{'超過種類'}}->{$r->{'超過時間コード'}}->{$r->{'勤務コード'}} == 0);
				$sth->execute(
						$s->{'dbh'}->{'date'},
						$s->{'init'}->{'mibun'},	
						$r->{'超過種類'},
						$r->{'超過時間コード'},
						$s->{'dbh'}->{'date'});
				$r2 = $sth->fetchrow_hashref();

				# 個人別の割増率が登録してある場合は個人別を使用する。
				$sth3->execute(
						$s->{'dbh'}->{'date'},
						$ref->{'氏名コード'},	
						$r->{'超過種類'},
						$r->{'超過時間コード'},
						$s->{'dbh'}->{'date'});
				if($r3 = $sth3->fetchrow_hashref()){
					$r2 = $r3;
				}

				$s->{'dbh'}->{'pca'}->{dbh}->do($s->{dbh}->{pca}->euc2sj(qq/
					insert $s->{table_zangyou} (
						氏名CD,
						履歴,
						超過種類,
						超過時間コード,
						割増率コード,
						勤務コード,
						残業時間,
						割増率
					)values(
					"@{[sprintf("%06d",$ref->{'氏名コード'})]}",
					'0',
					"$r->{'超過種類'}",
					"$r->{'超過時間コード'}",
					"$r2->{'割増率コード'}",
					"$r->{'勤務コード'}",
					"$s->{'T月例処理用残業集計データ'}->{$r->{'超過種類'}}->{$r->{'超過時間コード'}}->{$r->{'勤務コード'}}",
					"$r2->{'割増率'}"
					)/
					));
				if($s->{'dbh'}->{'pca'}->{dbh}->errstr){
				print <<END_SQL ;
					insert $s->{table_zangyou} (
						氏名CD,
						履歴,
						超過種類,
						超過時間コード,
						割増率コード,
						勤務コード,
						残業時間,
						割増率
					)values(
					"@{[sprintf("%06d",$ref->{'氏名コード'})]}",
					'0',
					"$r->{'超過種類'}",
					"$r->{'超過時間コード'}",
					"$r2->{'割増率コード'}",
					"$r->{'勤務コード'}",
					"$s->{'T月例処理用残業集計データ'}->{$r->{'超過種類'}}->{$r->{'超過時間コード'}}->{$r->{'勤務コード'}}",
					"$r2->{'割増率'}"
END_SQL
				}
			}
		}
	}
}
sub KintaiSumry{
	my ($s,$r,$ag,$etc)  = @_;			# 届データ１件
							# 他引数(kinmu:勤務区分)
	if(grep {$r->{'届コード'} eq $_} qw(71 74 75)){	# 71:廃休、74:代出（日）、75:代出（分）
		$ag->{kinmu} = $r->{'勤務コード'};
		$s->{kinmu_sv} = $r->{'勤務コード'};
		$s->{todokebi} = $r->{'届日'};
	}
	if(grep {$r->{'届コード'} eq $_} qw(73)){	# 73:深夜
		if($ag->{kinmu} eq ''){			# 休日
			if($s->{todokebi} eq $r->{'届日'}){
				$ag->{kinmu} = $s->{kinmu_sv};	#     休日の深夜残業は１件前の勤務コードを使用
			}
		}
		if($ag->{kinmu} eq ''){			# 休日
			$ag->{kinmu} = "H";		#     平常(H)を使用
		}
	}

	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'勤務時間'} += $s->RoudouJikan($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'所定日数'} += 0;
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'出勤日数'} += $s->SyukkinNissu($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'勤務日数'} += $s->KinmuNissu($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'有給日数'} += $s->YuukyuNissu($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'半休日数'} += $s->HankyuNissu($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'廃休日数'} += $s->HaikyuNissu($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'欠勤１日数'} += $s->Kekkin1Nissu($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'欠勤２日数'} += $s->Kekkin2Nissu($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'代出時間'} += $s->DaisyutuJikan($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'深夜時間'} += $s->ShinyaJikan($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'遅早外減給時間'} += $s->TisougaiGenkyu($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'遅早外無給時間'} += $s->TisougaiMukyu($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'ズレ手当控除回数'} += $s->ZureKoujoCnt($r,$ag);
	$s->{'T月例処理用勤怠集計データ'}->{$ag->{kinmu}}->{'夜勤遅早外回数'} += $s->YakinChisougaiCnt($r,$ag);
}
sub NissuSum{
	my ($s,$r,$ymd,$kinmu,$etc) = @_;
	$s->{'T月例処理用勤怠集計データ'}->{$kinmu}->{'所定日数'}++;
	if($s->{dbh}->{dbh}->diffdate($ymd,$r->{'入社日'})<0){
		$s->{'T月例処理用勤怠集計データ'}->{$kinmu}->{'欠勤２日数'}++;
	}
	elsif($s->{dbh}->{dbh}->diffdate($ymd,$r->{'退職日'})>0 and $r->{'退職日'} ne '0000-00-00'){
		$s->{'T月例処理用勤怠集計データ'}->{$kinmu}->{'欠勤２日数'}++;
	}
	else{
		$s->{'T月例処理用勤怠集計データ'}->{$kinmu}->{'出勤日数'}++;
		$s->{'T月例処理用勤怠集計データ'}->{$kinmu}->{'勤務日数'}++;
		$s->{'T月例処理用勤怠集計データ'}->{$kinmu}->{'勤務時間'} += 
			$s->{dbh}->{kinmuMaster}->{$kinmu}->{'労働時間'}
			- $s->{init}->{syoteijikan};
	}
}
sub NissuSum2{

=head2 期末処理用 [NissuSum2]

	(kin501.cgi)
	$kintaiSyukei->NissuSum2($ref,						# 人事マスタ１件
				$ymd,						# 対象日
				$kinmu->{$ymd})					# 勤務区分

	期末処理用に月の途中までで締めた時に勤怠締め日までの日数を
	所定日数と欠勤２日数に加算する。

=cut



	my ($s,$r,$ymd,$kinmu,$etc) = @_;
	$s->{'T月例処理用勤怠集計データ'}->{$kinmu}->{'所定日数'}++;
	$s->{'T月例処理用勤怠集計データ'}->{$kinmu}->{'欠勤２日数'}++;
}
sub RoudouJikan{				# 勤務時間計算
	my ($s,$r,$ag,$etc)  = @_;		# 届データ１件
						# 他引数(kinmu:勤務区分)
	my $minute = 0;
	if($r->{'届コード'} eq '70'){		# 70:残業
		$minute = $s->{dbh}->{dbh}->hm2m($r->{'時間'}/100);
		if($minute > $s->{init}->{syoteijikan}){
			$minute = $s->{init}->{syoteijikan};
		}
	}
	elsif(grep {$r->{'届出区分'} eq $_} qw(3 Z) ){	# 3:無給、Z:無届   （減算）
		$minute = ($s->{dbh}->{kinmuMaster}->{$ag->{kinmu}}->{'労働時間'}
			- $s->{init}->{syoteijikan}) * -1;
	}
	return $minute;
}
sub SyukkinNissu{				# 出勤日数
	my ($s,$r,$ag,$etc)  = @_;
	my $nissu = 0;
	if(grep {$r->{'届コード'} eq $_} qw(74 75)){	# 74:代出、75:代出
		$nissu = 1;
	}
	elsif(grep {$r->{'届コード'} eq $_} qw(22)){	# 22:代休 
		$nissu = -1;
	}
	elsif(grep {$r->{'届出区分'} eq $_} qw(Z)){	# Z:無届 
		$nissu = -1;
	}
	elsif($r->{'届出区分'} gt '1' and $r->{'届出区分'} lt '8'){
		$nissu = -1;
	}
	elsif($r->{'届出区分'} eq '1' and $s->{'init'}->{'mibun'} == 1){
		$nissu = -1;				# 社員は有給の場合に出勤日数より減算
	}
	return $nissu;
}
sub KinmuNissu{					# 勤務日数
	my ($s,$r,$ag,$etc)  = @_;
	my $nissu = 0;
	if(grep {$r->{'届コード'} eq $_} qw(74 75)){	# 74:代出、75:代出
		$nissu = 1;
	}
	#手当計算用に勤務日数より減算し有給日数に加算する(22,4,7,8,24)
	elsif(grep {$r->{'届コード'} eq $_} qw(22)){	# 22:代休
		$nissu = -1;
	}
	elsif(grep {$r->{'届コード'} eq $_} qw(4 7 8 24)){	# 4:生休、7:欠２、8:組合、24:介護 
		$nissu = -1;
	}

	elsif($r->{'届出区分'} ge '1' and $r->{'届出区分'} lt '8'){
		$nissu = -1;
	}
	return $nissu;
}
sub YuukyuNissu{				# 有給日数
	my ($s,$r,$ag,$etc)  = @_;
	my $nissu = 0;
	if(grep {$r->{'届出区分'} eq $_} qw(1)){
		$nissu = 1;
	}
	#手当計算用に勤務日数より減算し有給日数に加算する(22,4,7,8,24)
	elsif(grep {$r->{'届コード'} eq $_} qw(22)){	# 22:代休
		$nissu = 1;
	}
	elsif(grep {$r->{'届コード'} eq $_} qw(4 7 8 24)){	# 4:生休、7:欠２、8:組合、24:介護 
		$nissu = 1;
	}

	return $nissu;
}
sub HankyuNissu{				# 半休日数
	my ($s,$r,$ag,$etc)  = @_;
	my $nissu = 0;
	if($r->{'届コード'} >= 80 and $r->{'届コード'} <= 122){
		$nissu = 1;
	}
	return $nissu;
}
sub HaikyuNissu{				# 廃休日数
	my ($s,$r,$ag,$etc)  = @_;
	my $nissu = 0;
	if($r->{'届コード'} eq '71' ){
		$nissu = 1;
	}
	return $nissu;
}
sub Kekkin1Nissu{				# 欠勤１日数（減給）
	my ($s,$r,$ag,$etc)  = @_;
	my $nissu = 0;
	if(grep {$r->{'届出区分'} eq $_} qw(2) ){
		$nissu = 1;
	}
	return $nissu;
}
sub Kekkin2Nissu{				# 欠勤２日数（無給）
	my ($s,$r,$ag,$etc)  = @_;
	my $nissu = 0;
	if(grep {$r->{'届出区分'} eq $_} qw(3 Z) ){
		$nissu = 1;
	}
	return $nissu;
}
sub DaisyutuJikan{				# 代出時間
	my ($s,$r,$ag,$etc)  = @_;
	my $minute = 0;
	if($r->{'届コード'} eq '75'){		# 75:代出(時間)
		$minute = $s->{dbh}->{dbh}->hm2m($r->{'時間'}/100);
	}
	elsif($r->{'届コード'} eq '74'){	# 74:代出(日数)	
		$minute = $s->{dbh}->{kinmuMaster}->{$ag->{kinmu}}->{'労働時間'}
			- $s->{init}->{syoteijikan};
	}
	return $minute;
}
sub ShinyaJikan{				# 深夜時間
	my ($s,$r,$ag,$etc)  = @_;
	my $minute = 0;
	if($r->{'届コード'} eq '73'){		# 73:深夜
		$minute = $s->{dbh}->{dbh}->hm2m($r->{'時間'}/100);
	}
	return $minute;
}
sub TisougaiGenkyu{				# 遅早外減給時間
	my ($s,$r,$ag,$etc)  = @_;
	my $minute = 0;
	if(grep {$r->{'届コード'} eq $_} qw(51 54 57)){		# 51:遅刻2,54:早退2,57:外出2
		$minute = $r->{'時間'};
	}
	return $minute;
}
sub TisougaiMukyu{				# 遅早外無給時間
	my ($s,$r,$ag,$etc)  = @_;
	my $minute = 0;
	if(grep {$r->{'届コード'} eq $_} qw(52 55 58 59)){	# 52:遅刻3,55:早退3,558外出3,59:組合
		$minute = $r->{'時間'};
	}
	return $minute;
}
sub ZureKoujoCnt{				# ズレ手当控除回数
	my ($s,$r,$ag,$etc)  = @_;
	my $cnt = 0;
	my ($core);
	my ($zuke,@st,@en);
	if(grep {$r->{'届コード'} eq $_} (50 .. 58 ,80 .. 122)){
	}
	else{
		return 0;
	}
	$core = {1=>{st=>8.30,en=>18.00},
		2=>{st=>20.30,en=>6.00}};
	@st = ($core->{1}->{st},$core->{1}->{st},0);
	@en = ($core->{1}->{en},$core->{1}->{en},0);
	$zure = abs($s->{dbh}->{kinmuMaster}->{$ag->{kinmu}}->{'開始時間'} - $core->{1}->{st}) <
		abs($s->{dbh}->{kinmuMaster}->{$ag->{kinmu}}->{'開始時間'} - $core->{2}->{st}) ?
			"1" :
			"2";
	
#	print "[$core->{$zure}->{st},$core->{$zure}->{en},$r->{'届コード'}]";
	if($s->{dbh}->{kinmuMaster}->{$ag->{kinmu}}->{'開始時間'} < $core->{$zure}->{st}){
			@st = ($s->{dbh}->{kinmuMaster}->{$ag->{kinmu}}->{'開始時間'},$core->{$zure}->{st});
	}
	if($s->{dbh}->{kinmuMaster}->{$ag->{kinmu}}->{'終了時間'} > $core->{$zure}->{en}){
			@en = ($core->{$zure}->{en},$s->{dbh}->{kinmuMaster}->{$ag->{kinmu}}->{'終了時間'});
	}
	$st[2] = $s->{dbh}->{dbh}->hm2m($st[1]) - $s->{dbh}->{dbh}->hm2m($st[0]);
	$en[2] = $s->{dbh}->{dbh}->hm2m($en[1]) - $s->{dbh}->{dbh}->hm2m($en[0]);

	if(grep {$r->{'届コード'} eq $_} (56,57,58)){
		$cnt = $r->{'時刻１'} * 100 % 100 + $r->{'時間'};
		$cnt = $r->{'時刻１'} % 100 + ($cnt - $cnt % 60) / 60 + $cnt % 60 / 100;
	}
	if($st[2] > 0){
		if(grep {$r->{'届コード'} eq $_} (50,51,52)){
			$cnt = $r->{'時間'} < $st[2] ? $r->{'時間'} : $st[2];
		}
		if(grep {$r->{'届コード'} eq $_} (80 .. 122) and $r->{'時刻１'} == 1){
			$cnt = $st[2];
		}
		if(grep {$r->{'届コード'} eq $_} (56,57,58)){
			if($r->{'時刻１'} <= $st[1] and $cnt >= $st[0]){
				$cnt = $s->{dbh}->{dbh}->hm2m($cnt < $st[1] ? $cnt : $st[1])
					- $s->{dbh}->{dbh}->hm2m($r->{'時刻１'} > $st[0] ? $r->{'時刻１'} : $st[0]);
			}
		}
	}
	if($en[2] > 0){
		if(grep {$r->{'届コード'} eq $_} (53,54,55)){
			$cnt = $r->{'時間'} < $en[2] ? $r->{'時間'} : $en[2];
		}
		if(grep {$r->{'届コード'} eq $_} (80 .. 122) and $r->{'時刻１'} == 2){
			$cnt = $en[2];
		}
		if(grep {$r->{'届コード'} eq $_} (56,57,58)){
			if($r->{'時刻１'} <= $en[1] and $cnt >= $en[0]){
				$cnt = $s->{dbh}->{dbh}->hm2m($cnt < $en[1] ? $cnt : $en[1])
					- $s->{dbh}->{dbh}->hm2m($r->{'時刻１'} > $en[0] ? $r->{'時刻１'} : $en[0]);
			}
		}
	}
	$cnt = $s->{dbh}->{dbh}->hasuu(-n=>$cnt/30 ,-a=>0,-u=>1);
#	print "[$cnt]";
	return $cnt;
}
sub YakinChisougaiCnt{				# 夜勤遅早外回数
	my ($s,$r,$ag,$etc)  = @_;
	my $cnt = 0;
	if(grep {$r->{'届コード'} eq $_} qw(51 52 54 55 57 58 59)){	# 52:遅刻3,55:早退3,558外出3,59:組合
		$cnt = $s->{dbh}->{dbh}->hasuu(-n=>$r->{'時間'}/30 ,-a=>0,-u=>1);
#		print "[$cnt $r->{'届コード'}]";
	}
	return $cnt;
}
sub kintai_put{
	my $s = shift;
	my $ref = shift;
	my $sql;
	my $r = {};
	for (keys %{$s->{'T月例処理用勤怠集計データ'}}){
		next if($_ eq '');
		$r->{'勤務コード'} = $_;

		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'勤務時間'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'所定日数'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'出勤日数'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'勤務日数'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'有給日数'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'半休日数'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'廃休日数'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'欠勤１日数'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'欠勤２日数'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'代出時間'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'深夜時間'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'遅早外減給時間'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'遅早外無給時間'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'ズレ手当控除回数'} += 0;
		$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'夜勤遅早外回数'} += 0;

		$s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'勤務名称'} =~ s/1/１/;
		$s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'勤務名称'} =~ s/2/２/;
		$s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'勤務名称'} =~ s/3/３/;
		$sql = qq{
			insert $s->{table_kintai} (
				氏名CD,
				履歴,
				勤務コード,
				勤務時間,
				所定日数,
				出勤日数,
				勤務日数,
				有給日数,
				半日日数,
				廃休日数,
				欠勤１日数,
				欠勤２日数,
				代出時間,
				深夜時間,
				遅早外減給時間,
				遅早外無給時間,
				ズレ手当控除回数,
				夜勤遅早外回数,
				勤務名称,
				労働時間,
				計算基礎時間,
				勤務地コード,
				交替手当,
				ズレ手当,
				夜勤手当
			)values(
				"@{[sprintf("%06d",$ref->{'氏名コード'})]}",
				'0',
				"$r->{'勤務コード'}",
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'勤務時間'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'所定日数'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'出勤日数'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'勤務日数'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'有給日数'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'半休日数'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'廃休日数'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'欠勤１日数'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'欠勤２日数'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'代出時間'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'深夜時間'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'遅早外減給時間'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'遅早外無給時間'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'ズレ手当控除回数'},
				$s->{'T月例処理用勤怠集計データ'}->{$r->{'勤務コード'}}->{'夜勤遅早外回数'},
				"@{[jcode($s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'勤務名称'},
						'euc')->h2z]}", 
				$s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'労働時間'}, 
				@{[$s->KeisanKisoJikan($s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'計算基礎時間区分'})]}, 
				$s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'勤務地コード'}, 
				$s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'交替手当'}, 
				$s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'ズレ手当'}, 
				$s->{dbh}->{kinmuMaster}->{$r->{'勤務コード'}}->{'夜勤手当'} 
			)};
		$s->{'dbh'}->{'pca'}->{dbh}->do($s->{dbh}->{pca}->euc2sj($sql));
		if($s->{'dbh'}->{'pca'}->{dbh}->errstr){
			print "@{[$s->{dbh}->{pca}->sj2euc($s->{'dbh'}->{'pca'}->{dbh}->errstr)]} <br>\n";
			print "$sql<br>\n";
		}
	}
}
sub KeisanKisoJikan{
	my ($s,@etc) = @_;
	return $s->{'計算基礎時間マスタ'}->{$etc[0]}->{'計算基礎時間'}; 
}
1;
__END__

=head1 AUTHOR INFORMATION

 ;######################################################################
 ;#
 ;# kintai.pm - 勤怠データ集計
 ;#
 ;# Copyright (c) 2010 HORI Masashi <hori@japannet.co.jp>
 ;# JapanNet. All Rights Reserved.
 ;#
 ;#
 ;######################################################################

ALTER TABLE 勤務名称マスタ ADD 勤務地コード DECIMAL(1) NOT NULL, ADD 交替手当 DECIMAL(1) NOT NULL, ADD ズレ手当 DECIMAL(1) NOT NULL, ADD 夜勤手当 DECIMAL(1) NOT NULL 

=cut

