Compare commits

...

7 Commits

Author SHA1 Message Date
efbd3ca782 Profile related works 2025-02-23 16:13:19 +06:00
751ae428bb blood group 2025-02-23 09:07:30 +06:00
e9b6337030 EnumBloodgroup changed 2025-02-23 09:01:17 +06:00
057e27c226 multiple letter generation 2025-02-12 18:02:49 +06:00
083ae15e1e employee profile issues 2025-02-12 11:12:32 +06:00
6e8a28a477 roster assignment type addition 2025-02-05 15:02:49 +06:00
f418e7ab3d employee profile issues upon client requirement 2025-02-04 12:12:16 +06:00
31 changed files with 560 additions and 102 deletions

View File

@ -1477,16 +1477,16 @@ namespace HRM.BO
public enum EnumBloodGroup public enum EnumBloodGroup
{ {
None = 0, NA = 0,
APos = 1, None = 1,
ANeg = 2, APos = 2,
BPos = 3, ANeg = 3,
BNeg = 4, BPos = 4,
OPos = 5, BNeg = 5,
ONeg = 6, OPos = 6,
ABPos = 7, ONeg = 7,
ABNeg = 8, ABPos = 8,
NA = 9 ABNeg = 9
} }

View File

@ -259,7 +259,9 @@ namespace HRM.BO
public Relation ContactPersonRelation { get; set; } public Relation ContactPersonRelation { get; set; }
public string PermanentAddressInBangla { get; set; } public string PermanentAddressInBangla { get; set; }
public string PresentAddressInBangla { get; set; } public string PresentAddressInBangla { get; set; }
public string PresentPO { get; set; }
public string PresentPOInBangla { get; set; } public string PresentPOInBangla { get; set; }
public string PermanentPO { get; set; }
public string ParmanentPOInBangla { get; set; } public string ParmanentPOInBangla { get; set; }
//#region Property PermanentDistrict : District //#region Property PermanentDistrict : District
@ -1309,8 +1311,8 @@ namespace HRM.BO
#endregion #endregion
//CGPA or Marks //CGPA or Marks
#region GPAOrMarks #region GPAOrMarks
private double _gpa; private double? _gpa;
public double GPAOrMarks public double? GPAOrMarks
{ {
get { return _gpa; } get { return _gpa; }
set { _gpa = value; } set { _gpa = value; }
@ -1319,8 +1321,8 @@ namespace HRM.BO
//OutOf //OutOf
#region Property OutOf : double #region Property OutOf : double
private double _outOf; private double? _outOf;
public double OutOf public double? OutOf
{ {
get { return _outOf; } get { return _outOf; }
set { _outOf = value; } set { _outOf = value; }

View File

@ -434,12 +434,12 @@ namespace HRM.DA
"EmployeeID, ContactID, PARMANENTADDRESS, PARMANENTDISTRICTID, PARMANENTTHANAID, PARMANENTTELEPHONE," + "EmployeeID, ContactID, PARMANENTADDRESS, PARMANENTDISTRICTID, PARMANENTTHANAID, PARMANENTTELEPHONE," +
" PresentAddress, PresentDistrictID, PresentThanaID, PresentTelephone, Mobile, PersonalEmail," + " PresentAddress, PresentDistrictID, PresentThanaID, PresentTelephone, Mobile, PersonalEmail," +
" OfficialEMail, Fax, EmergencyContactAddress, EmergencyContactPerson, EmergencyTelephone, PARMANENTMOBILE, " + " OfficialEMail, Fax, EmergencyContactAddress, EmergencyContactPerson, EmergencyTelephone, PARMANENTMOBILE, " +
" PRESENTMOBILE, PERSONALTELEPHONE, EMERGENCYMOBILE, CPRELATIONID,ProfileStatus,PermanentAddressInBangla,PresentAddressInBangla,PermanentPostCodeNo,PresentPostCodeNo, PresentPOInBangla, ParmanentPOInBangla)" + " PRESENTMOBILE, PERSONALTELEPHONE, EMERGENCYMOBILE, CPRELATIONID,ProfileStatus,PermanentAddressInBangla,PresentAddressInBangla,PermanentPostCodeNo,PresentPostCodeNo, PresentPOInBangla, ParmanentPOInBangla, PresentPO, PermanentPO)" +
" VALUES(" + " VALUES(" +
" %n, %n, %s, %n, %n, %s, " + " %n, %n, %s, %n, %n, %s, " +
" %s, %n, %n, %s, %s, %s," + " %s, %n, %n, %s, %s, %s," +
" %s, %s, %s, %s, %s, %s," + " %s, %s, %s, %s, %s, %s," +
" %s, %s, %s, %n,%n, %u, %u, %s, %s, %u, %u)", " %s, %s, %s, %n,%n, %u, %u, %s, %s, %u, %u, %s, %s)",
item.EmployeeID, item.ID, item.PermanentAddress, DataReader.GetNullValue(item.PermanentDistrictID, 0), item.EmployeeID, item.ID, item.PermanentAddress, DataReader.GetNullValue(item.PermanentDistrictID, 0),
DataReader.GetNullValue(item.PermanentThanaID, 0), item.PermanentTelephone, DataReader.GetNullValue(item.PermanentThanaID, 0), item.PermanentTelephone,
item.PresentAddress, DataReader.GetNullValue(item.PresentDistrictID, 0), item.PresentAddress, DataReader.GetNullValue(item.PresentDistrictID, 0),
@ -448,7 +448,7 @@ namespace HRM.DA
item.EmergencyTelephone, DataReader.GetNullValue(item.PermanentMobile), item.EmergencyTelephone, DataReader.GetNullValue(item.PermanentMobile),
DataReader.GetNullValue(item.PresentMobile), DataReader.GetNullValue(item.PersonalTelephone), DataReader.GetNullValue(item.PresentMobile), DataReader.GetNullValue(item.PersonalTelephone),
DataReader.GetNullValue(item.EmergencyMobile), DataReader.GetNullValue(item.EmergencyMobile),
DataReader.GetNullValue(item.ContactPersonRelationId, 0), item.ProfileStatus, item.PermanentAddressInBangla, item.PresentAddressInBangla, item.PermanentPostCodeNo, item.PresentPostCodeNo, item.PresentPOInBangla, item.ParmanentPOInBangla); DataReader.GetNullValue(item.ContactPersonRelationId, 0), item.ProfileStatus, item.PermanentAddressInBangla, item.PresentAddressInBangla, item.PermanentPostCodeNo, item.PresentPostCodeNo, item.PresentPOInBangla, item.ParmanentPOInBangla, item.PresentPO, item.PermanentPO);
tc.ExecuteNonQuery(sql); tc.ExecuteNonQuery(sql);
} }
@ -459,7 +459,7 @@ namespace HRM.DA
"PARMANENTADDRESS =%s , PARMANENTDISTRICTID =%n, PARMANENTTHANAID =%n, PARMANENTTELEPHONE=%s," + "PARMANENTADDRESS =%s , PARMANENTDISTRICTID =%n, PARMANENTTHANAID =%n, PARMANENTTELEPHONE=%s," +
" PresentAddress=%s, PresentDistrictID=%n, PresentThanaID=%n, PresentTelephone=%s, Mobile =%s, PersonalEmail=%s," + " PresentAddress=%s, PresentDistrictID=%n, PresentThanaID=%n, PresentTelephone=%s, Mobile =%s, PersonalEmail=%s," +
" OfficialEMail=%s, Fax=%s, EmergencyContactAddress=%s, EmergencyContactPerson=%s, EmergencyTelephone=%s, PARMANENTMOBILE=%s, " + " OfficialEMail=%s, Fax=%s, EmergencyContactAddress=%s, EmergencyContactPerson=%s, EmergencyTelephone=%s, PARMANENTMOBILE=%s, " +
" PRESENTMOBILE=%s, PERSONALTELEPHONE=%s, EMERGENCYMOBILE=%s, CPRELATIONID=%n,ProfileStatus=%n,PermanentAddressInBangla=%u,PresentAddressInBangla=%u,PermanentPostCodeNo=%s,PresentPostCodeNo=%s, PresentPOInBangla = %u, ParmanentPOInBangla = %u" + " PRESENTMOBILE=%s, PERSONALTELEPHONE=%s, EMERGENCYMOBILE=%s, CPRELATIONID=%n,ProfileStatus=%n,PermanentAddressInBangla=%u,PresentAddressInBangla=%u,PermanentPostCodeNo=%s,PresentPostCodeNo=%s, PresentPOInBangla = %u, ParmanentPOInBangla = %u, PresentPO = %s, PermanentPO = %s" +
" where EmployeeID =%n and ContactID =%n ", " where EmployeeID =%n and ContactID =%n ",
item.PermanentAddress, DataReader.GetNullValue(item.PermanentDistrictID, 0), item.PermanentAddress, DataReader.GetNullValue(item.PermanentDistrictID, 0),
DataReader.GetNullValue(item.PermanentThanaID, 0), item.PermanentTelephone, DataReader.GetNullValue(item.PermanentThanaID, 0), item.PermanentTelephone,
@ -469,7 +469,7 @@ namespace HRM.DA
item.EmergencyTelephone, DataReader.GetNullValue(item.PermanentMobile), item.EmergencyTelephone, DataReader.GetNullValue(item.PermanentMobile),
DataReader.GetNullValue(item.PresentMobile), DataReader.GetNullValue(item.PersonalTelephone), DataReader.GetNullValue(item.PresentMobile), DataReader.GetNullValue(item.PersonalTelephone),
DataReader.GetNullValue(item.EmergencyMobile), DataReader.GetNullValue(item.EmergencyMobile),
DataReader.GetNullValue(item.ContactPersonRelationId, 0), item.ProfileStatus, item.PermanentAddressInBangla, item.PresentAddressInBangla, item.PermanentPostCodeNo, item.PresentPostCodeNo, item.PresentPOInBangla, item.ParmanentPOInBangla, item.EmployeeID, item.ID); DataReader.GetNullValue(item.ContactPersonRelationId, 0), item.ProfileStatus, item.PermanentAddressInBangla, item.PresentAddressInBangla, item.PermanentPostCodeNo, item.PresentPostCodeNo, item.PresentPOInBangla, item.ParmanentPOInBangla, item.PresentPO, item.PermanentPO, item.EmployeeID, item.ID);
tc.ExecuteNonQuery(sql); tc.ExecuteNonQuery(sql);
} }
@ -588,8 +588,8 @@ namespace HRM.DA
academic.ID, academic.EmployeeID, academic.EducationLevelID, academic.ID, academic.EmployeeID, academic.EducationLevelID,
DataReader.GetNullValue(academic.DisciplineID, 0), DataReader.GetNullValue(academic.InstitutionID, 0), DataReader.GetNullValue(academic.DisciplineID, 0), DataReader.GetNullValue(academic.InstitutionID, 0),
DataReader.GetNullValue(academic.PassingYear), DataReader.GetNullValue(academic.PassingYear),
DataReader.GetNullValue(academic.ClassOrDivision), academic.GPAOrMarks, academic.LastLevel, DataReader.GetNullValue(academic.ClassOrDivision), DataReader.GetNullValue(academic.GPAOrMarks), academic.LastLevel,
academic.OutOf, DataReader.GetNullValue(academic.ResultTypeID, 0), DataReader.GetNullValue(academic.OutOf), DataReader.GetNullValue(academic.ResultTypeID),
DataReader.GetNullValue(academic.InstituteName), DataReader.GetNullValue(academic.EducationTypeID, 0), DataReader.GetNullValue(academic.InstituteName), DataReader.GetNullValue(academic.EducationTypeID, 0),
academic.PhotoPath, academic.DocSubmissionDate, academic.ProfileStatus); academic.PhotoPath, academic.DocSubmissionDate, academic.ProfileStatus);
} }
@ -602,8 +602,8 @@ namespace HRM.DA
" where AcademicID =%n and EmployeeID =%n ", academic.EducationLevelID, " where AcademicID =%n and EmployeeID =%n ", academic.EducationLevelID,
DataReader.GetNullValue(academic.DisciplineID, 0), DataReader.GetNullValue(academic.InstitutionID, 0), DataReader.GetNullValue(academic.DisciplineID, 0), DataReader.GetNullValue(academic.InstitutionID, 0),
DataReader.GetNullValue(academic.PassingYear), DataReader.GetNullValue(academic.PassingYear),
DataReader.GetNullValue(academic.ClassOrDivision), academic.GPAOrMarks, academic.LastLevel, DataReader.GetNullValue(academic.ClassOrDivision), DataReader.GetNullValue(academic.GPAOrMarks), academic.LastLevel,
academic.OutOf, DataReader.GetNullValue(academic.ResultTypeID, 0), DataReader.GetNullValue(academic.OutOf), DataReader.GetNullValue(academic.ResultTypeID),
DataReader.GetNullValue(academic.InstituteName), DataReader.GetNullValue(academic.EducationTypeID, 0), DataReader.GetNullValue(academic.InstituteName), DataReader.GetNullValue(academic.EducationTypeID, 0),
academic.PhotoPath, academic.DocSubmissionDate, academic.ProfileStatus, academic.PhotoPath, academic.DocSubmissionDate, academic.ProfileStatus,
academic.ID, academic.EmployeeID); academic.ID, academic.EmployeeID);

View File

@ -385,9 +385,16 @@ END;";
if (name != string.Empty) if (name != string.Empty)
sqlClause = SQLParser.TagSQL(sqlClause) + SQLParser.MakeSQL("Name LIKE %s", ("%" + name + "%")); sqlClause = SQLParser.TagSQL(sqlClause) + SQLParser.MakeSQL("Name LIKE %s", ("%" + name + "%"));
//string finalSQl = SQLParser.MakeSQL(
// "%q Select %q EmployeeID, EmployeeNo, Name, categoryID, GradeID, LocationID, designationid, DepartmentID From Employee %q %q Order by %s",
// recurSqlClause, top, sqlClause, recurWhereClause, orderby);
string finalSQl = SQLParser.MakeSQL( string finalSQl = SQLParser.MakeSQL(
"%q Select %q EmployeeID, EmployeeNo, Name, categoryID, GradeID, LocationID, designationid, DepartmentID From Employee %q %q Order by %s", "%q Select %q EmployeeID, EmployeeNo, Name, categoryID, GradeID, LocationID, designationid, DepartmentID From Employee %q %q " +
recurSqlClause, top, sqlClause, recurWhereClause, orderby); " UNION Select %q EmployeeID, EmployeeNo, Name, categoryID, GradeID, LocationID, designationid, DepartmentID From Employee %q " +
" Order by %s",
recurSqlClause, top, sqlClause, recurWhereClause, top, sqlClause, orderby);
return tc.ExecuteReader(finalSQl); return tc.ExecuteReader(finalSQl);
} }

View File

@ -254,6 +254,8 @@ namespace HRM.DA
oEmpContact.ProfileStatus = (EnumProfileStatus)oReader.GetInt32("ProfileStatus").GetValueOrDefault(); oEmpContact.ProfileStatus = (EnumProfileStatus)oReader.GetInt32("ProfileStatus").GetValueOrDefault();
oEmpContact.PresentPOInBangla = oReader.GetString("PresentPOInBangla", true, null); oEmpContact.PresentPOInBangla = oReader.GetString("PresentPOInBangla", true, null);
oEmpContact.ParmanentPOInBangla = oReader.GetString("ParmanentPOInBangla", true, null); oEmpContact.ParmanentPOInBangla = oReader.GetString("ParmanentPOInBangla", true, null);
oEmpContact.PresentPO = oReader.GetString("PresentPO", true, null);
oEmpContact.PermanentPO = oReader.GetString("PermanentPO", true, null);
this.SetObjectState(oEmpContact, ObjectState.Saved); this.SetObjectState(oEmpContact, ObjectState.Saved);
} }
@ -596,8 +598,8 @@ namespace HRM.DA
oEmpAcademic.ProfileStatus = (EnumProfileStatus)oReader.GetInt32("ProfileStatus", 0); oEmpAcademic.ProfileStatus = (EnumProfileStatus)oReader.GetInt32("ProfileStatus", 0);
oEmpAcademic.ResultTypeID = oReader.GetInt32("ResultTypeID", 0); oEmpAcademic.ResultTypeID = oReader.GetInt32("ResultTypeID", 0);
oEmpAcademic.GPAOrMarks = oReader.GetDouble("GPAOrMarks", 0); oEmpAcademic.GPAOrMarks = oReader.GetDouble("OutOf").HasValue ? oReader.GetDouble("GPAOrMarks") : null;
oEmpAcademic.OutOf = oReader.GetDouble("OutOf", 0); oEmpAcademic.OutOf = oReader.GetDouble("OutOf").HasValue ? oReader.GetDouble("OutOf") : null;
oEmpAcademic.LastLevel = oReader.GetBoolean("LastLevel", false); oEmpAcademic.LastLevel = oReader.GetBoolean("LastLevel", false);
oEmpAcademic.InstituteName = oReader.GetString("InstituteName"); oEmpAcademic.InstituteName = oReader.GetString("InstituteName");
oEmpAcademic.PhotoPath = oReader.GetString("PhotoPath"); oEmpAcademic.PhotoPath = oReader.GetString("PhotoPath");

View File

@ -36,7 +36,9 @@ export class EmpContact extends BaseObject {
presentAddressInBangla: string; presentAddressInBangla: string;
permanentPostCodeNo: string; permanentPostCodeNo: string;
presentPostCodeNo: string; presentPostCodeNo: string;
presentPO: string;
presentPOInBangla: string; presentPOInBangla: string;
permanentPO: string;
parmanentPOInBangla: string; parmanentPOInBangla: string;
constructor() { constructor() {
super(); super();

View File

@ -998,6 +998,7 @@ export enum EnumTrainingCompletedFrom {
} }
export enum EnumBloodGroup { export enum EnumBloodGroup {
NA,
None, None,
APos, APos,
ANeg, ANeg,
@ -1006,7 +1007,7 @@ export enum EnumBloodGroup {
OPos, OPos,
ONeg, ONeg,
ABPos, ABPos,
ABNeg, ABNeg
} }
export enum EnumOGPositionType { export enum EnumOGPositionType {
@ -3149,14 +3150,15 @@ export enum EnumSuccessorReadiness {
} }
export let BloodGroupList = [ export let BloodGroupList = [
{ name: "A+", value: 1 }, { name: "N/A", value: 1 },
{ name: "A-", value: 2 }, { name: "A+", value: 2 },
{ name: "B+", value: 3 }, { name: "A-", value: 3 },
{ name: "B-", value: 4 }, { name: "B+", value: 4 },
{ name: "O+", value: 5 }, { name: "B-", value: 5 },
{ name: "O-", value: 6 }, { name: "O+", value: 6 },
{ name: "AB+", value: 7 }, { name: "O-", value: 7 },
{ name: "AB-", value: 8 }, { name: "AB+", value: 8 },
{ name: "AB-", value: 9 },
]; ];
export class EnumExtension { export class EnumExtension {

View File

@ -11,6 +11,7 @@ import { EnumLetterOrganizationType } from '../../_models/enums';
import { LetterRequest } from '../../_models/Letter-Request/Letter-Request'; import { LetterRequest } from '../../_models/Letter-Request/Letter-Request';
import { AuthorizedPerson } from '../../adhoc-feature/authorized-persons/authorizedPerson'; import { AuthorizedPerson } from '../../adhoc-feature/authorized-persons/authorizedPerson';
import { WFMovementTran } from '../../_models/Work-Flow/wFMovementTran'; import { WFMovementTran } from '../../_models/Work-Flow/wFMovementTran';
import { SearchEmployee } from 'src/app/_models/Employee/searchEmployee';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -233,6 +234,10 @@ export class LetterRequestService {
getImage(id: number) { getImage(id: number) {
return this.apiService.httpGet<any>('/LetterRequest/getImage' + '/' + id); return this.apiService.httpGet<any>('/LetterRequest/getImage' + '/' + id);
} }
generatedExceptiinLetter(type: number, param: SearchEmployee[]) {
return this.apiService.httpPost('/LetterRequest/generatedExceptiinLetter/' + type , param);
// return this.apiService.httpDownloadFile('/LetterRequest/generatedExceptiinLetter/' + type , param);
}
} }

View File

@ -19,6 +19,7 @@ import {LetterRequestByAdminApprovalComponent} from './letter-request-by-admin-a
import {ApproveFinancialDataComponent} from './approve-financial-data/approve-financial-data.component'; import {ApproveFinancialDataComponent} from './approve-financial-data/approve-financial-data.component';
import {AuthorizedPersonsComponent} from './authorized-persons/authorized-persons.component'; import {AuthorizedPersonsComponent} from './authorized-persons/authorized-persons.component';
import { LetterGenerateComponent } from './letter-generate/letter-generate.component'; import { LetterGenerateComponent } from './letter-generate/letter-generate.component';
import { ExceptionLetterGenerateComponent } from './exception-letter-generate/exception-letter-generate.component';
const routes: Routes = [ const routes: Routes = [
@ -31,6 +32,7 @@ const routes: Routes = [
{path: 'letter-generate', component: LetterGenerateComponent, canActivate: [AuthGuard]}, {path: 'letter-generate', component: LetterGenerateComponent, canActivate: [AuthGuard]},
{path: 'workflow-delegation-by-employee', component: WorkflowDelegationByEmployeeComponent, canActivate: [AuthGuard]}, {path: 'workflow-delegation-by-employee', component: WorkflowDelegationByEmployeeComponent, canActivate: [AuthGuard]},
{path: 'delegation-from-admin-panel', component: DelegationFromAdminPanelComponent, canActivate: [AuthGuard]}, {path: 'delegation-from-admin-panel', component: DelegationFromAdminPanelComponent, canActivate: [AuthGuard]},
{path: 'exception-letter-generate', component: ExceptionLetterGenerateComponent, canActivate: [AuthGuard]},
//{path: 'letter-request-by-employee-and-approval', component: LetterRequestByEmployeeAndApprovalComponent, canActivate: [AuthGuard]}, //{path: 'letter-request-by-employee-and-approval', component: LetterRequestByEmployeeAndApprovalComponent, canActivate: [AuthGuard]},
//{path: 'letter-request-approval', component: LetterRequestApprovalComponent, canActivate: [AuthGuard]}, //{path: 'letter-request-approval', component: LetterRequestApprovalComponent, canActivate: [AuthGuard]},
//{path: 'letter-print-by-admin-panel', component: LetterPrintByAdminPanelComponent, canActivate: [AuthGuard]}, //{path: 'letter-print-by-admin-panel', component: LetterPrintByAdminPanelComponent, canActivate: [AuthGuard]},

View File

@ -49,13 +49,14 @@ import { ApproveFinancialDataComponent } from './approve-financial-data/approve-
import { AuthorizedPersonsComponent } from './authorized-persons/authorized-persons.component'; import { AuthorizedPersonsComponent } from './authorized-persons/authorized-persons.component';
import { AuthorizedPersonComponent } from './authorized-persons/authorized-person/authorized-person.component'; import { AuthorizedPersonComponent } from './authorized-persons/authorized-person/authorized-person.component';
import { LetterGenerateComponent } from './letter-generate/letter-generate.component'; import { LetterGenerateComponent } from './letter-generate/letter-generate.component';
import { ExceptionLetterGenerateComponent } from './exception-letter-generate/exception-letter-generate.component';
@NgModule({ @NgModule({
declarations: [workflowRuleComponent, WorkFlowSetupComponent, WorkFlowSetupNewComponent, WorkFlowAdministrativeStatusComponent, declarations: [workflowRuleComponent, WorkFlowSetupComponent, WorkFlowSetupNewComponent, WorkFlowAdministrativeStatusComponent,
WorkFlowAdminComponent, WorkflowDelegationByEmployeeComponent, DelegationFromAdminPanelComponent, WorkFlowAdminComponent, WorkflowDelegationByEmployeeComponent, DelegationFromAdminPanelComponent,
LetterRequestApprovalComponent, LetterPrintByAdminPanelComponent, LetterRequestApprovalComponent, LetterPrintByAdminPanelComponent,
LetterRequestByAdminApprovalComponent, ApproveFinancialDataComponent, AuthorizedPersonsComponent, AuthorizedPersonComponent, LetterGenerateComponent LetterRequestByAdminApprovalComponent, ApproveFinancialDataComponent, AuthorizedPersonsComponent, AuthorizedPersonComponent, LetterGenerateComponent, ExceptionLetterGenerateComponent
], ],
imports: [ imports: [

View File

@ -0,0 +1,58 @@
<app-loading-panel> </app-loading-panel>
<div class="card" style="padding:10px;">
<div class="p-grid">
<div class="p-col-12">
<div class="p-grid">
<div class="p-col-4 p-md-2">
<label>Employee(s)</label>
</div>
<div class="p-col-8 p-md-4">
<!-- <app-employee-picker (ItemSelected)="GetSelectedEmployee($event)" [setSelectedEmp]="selectedEmps"
[MultiSelect]="true"></app-employee-picker> -->
<app-employee-picker (ItemSelected)="GetSelectedEmployee($event)"
[MultiSelect]="true"></app-employee-picker>
</div>
<div class="p-col-4 p-md-2">
<label>Letter</label>
</div>
<div class="p-col-8 p-md-4">
<kendo-dropdownlist [(ngModel)]="selectedreportType" [data]="reportTypes" [textField]="'text'"
[valueField]="'value'" [defaultItem]="{ text: 'Select Letter..', value: null }"
(valueChange)="onSelectReport($event)">
</kendo-dropdownlist>
</div>
<div class="p-col-12">
<kendo-grid #grid [data]="selectedEmps" [kendoGridSelectBy]="'employeeID'" [selectedKeys]="mySelection" [pageable]="false" [sortable]="true" [reorderable]="true"
[resizable]="true">
<!-- <ng-template kendoGridToolbarTemplate>
<button type="button" kendoButton icon="delete" class="kt-delete" (click)="onClickRemoveAll()">
Remove All
</button>
<kendo-grid-spacer></kendo-grid-spacer>
<label>Attendance Count: {{employeeList.length}} </label>
</ng-template> -->
<kendo-grid-checkbox-column [resizable]="false" [width]="45" showSelectAll="true">
</kendo-grid-checkbox-column>
<kendo-grid-column field="employeeNo" title="Employee No" [width]="150">
</kendo-grid-column>
<kendo-grid-column field="name" title="Employee Name" [width]="220">
</kendo-grid-column>
<kendo-grid-column field="departmentName" title="Department" [width]="220">
</kendo-grid-column>
<kendo-grid-column field="gradeName" title="Grade" [width]="220">
</kendo-grid-column>
<!-- <kendo-grid-column title="Actions" width="25%" align="middle">
<ng-template kendoGridCellTemplate let-dataItem let-rowIndex="rowIndex">
<button kendoButton class="kt-delete" icon="delete" style="width: fit-content;"
(click)="onClickRemove(dataItem)">Remove</button>
</ng-template>
</kendo-grid-column> -->
</kendo-grid>
<div class="p-col-12" align="right">
<button kendoButton icon="upload" type="button" (click)="generateLetter()" [primary] = true>Generate</button>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,162 @@
import { error } from 'console';
import { Component, OnInit } from '@angular/core';
import { DynamicPicker, EnumDynamicpickerType } from '../../picker/dynamic-picker/Dynamic-Picker';
import { SearchEmployee } from 'src/app/_models/Employee/searchEmployee';
import { Router } from '@angular/router';
import { ApiService } from 'src/app/app.api.service';
import { HRMNotificationService } from 'src/app/app.notification.service';
import { loadingPanelService } from 'src/app/hrm-loding panel/loding.panel.service';
import { BasicService } from 'src/app/_services/Basic/basic.service';
import { Department } from 'src/app/_models/Basic/department';
import { Grade } from 'src/app/_models/Basic/grade';
import { EnumStatus } from '../../_models/enums';
import { Employee } from 'src/app/_models/Employee/employee';
import { LetterRequestService } from 'src/app/_services/letter-request/letter-request.service';
import { saveAs } from 'file-saver';
@Component({
selector: 'app-exception-letter-generate',
templateUrl: './exception-letter-generate.component.html',
styleUrls: ['./exception-letter-generate.component.scss']
})
export class ExceptionLetterGenerateComponent implements OnInit {
public selectedEmps: SearchEmployee[] = [];
public mySelection: number[] = [];
public selectedreportType: EnumExceptionLetterTemplateType;
public reportTypes = Object.keys(EnumExceptionLetterTemplateType)
.filter(key => !isNaN(Number(EnumExceptionLetterTemplateType[key])))
.map(key => ({
text: key.replace(/_/g, ' '),
value: EnumExceptionLetterTemplateType[key]
}));
public allDepartments: Department[];
public allGrades: Grade[];
constructor(
public router: Router, public loadingPanel: loadingPanelService,
public notificationService: HRMNotificationService,
public apiService: ApiService,
public basicService: BasicService, public letterRequestService: LetterRequestService) {
this.apiService.selectedMenuName = 'Employee Letter Generation';
}
ngOnInit(): void {
// this.basicService.getAllDepartment(EnumStatus.Active).subscribe(
// (resp) => {
// this.allDepartments = resp;
// },
// (err: any) => {
// this.notificationService.showError(err.error);
// }
// );
// this.basicService.getAllGrade(EnumStatus.Active).subscribe(
// (resp) => {
// this.allGrades = resp;
// },
// (err: any) => {
// this.notificationService.showError(err.error);
// }
// );
}
public GetSelectedEmployee(childData) {
this.selectedEmps = childData;
// this.selectedEmps.forEach(element => {
// element.departmentName = this.allDepartments.find(d => d.id == element.departmentID).name;
// element.gradeName = this.allDepartments.find(g => g.id == element.gradeID).name;
// });
}
public onSelectReport(value: any) {
debugger;
}
generateLetter() {
let employeeDataToGenerate: SearchEmployee[] = [];
this.selectedEmps.forEach(element => {
this.mySelection.forEach(item => {
if (element.employeeID == item) employeeDataToGenerate.push(element);
});
});
this.selectedreportType;
if (this.selectedreportType == undefined || this.selectedreportType['value'] == null) {
this.notificationService.showWarning("Please select a Letter to Generate");
return;
}
if (employeeDataToGenerate.length <= 0) {
this.notificationService.showWarning("Please select Employee to Generate Letter");
return;
}
this.loadingPanel.ShowLoadingPanel = true;
this.letterRequestService.generatedExceptiinLetter(this.selectedreportType['value'], employeeDataToGenerate).subscribe(
(resp: any[]) => {
debugger
if (resp.length > 0) {
resp.forEach(fileData => {
// this.downloadBlob(new Blob([fileData.fileContents], { type: 'application/msword' }), 'application/msword', fileData.fileDownloadName);
this.downloadFileWord(fileData.fileContents, fileData.fileDownloadName);
});
}
this.loadingPanel.ShowLoadingPanel = false;
},
(err: any) => {
this.notificationService.showError(err.error);
this.loadingPanel.ShowLoadingPanel = false;
}
);
}
private downloadBlob(data: any, type: string, fileName: string): void {
const blob: Blob = new Blob([data], { type: type });
// const fileName: string = this.workOrderBillReceive.UploadAttachment[0].OriginalFileName;
// const fileName: string = fileName;
const objectUrl: string = URL.createObjectURL(blob);
const a: HTMLAnchorElement = document.createElement('a') as HTMLAnchorElement;
a.href = objectUrl;
a.download = fileName;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(objectUrl);
}
downloadFileWord(blobContent, fileName) {
// const blob = new Blob([this.b64toBlob(blobContent, 'application/data:application/vnd.openxmlformats-officedocument.wordprocessingml.document', 1024)], {});
// saveAs(blob, fileName + '.docx');
const blob = new Blob([this.b64toBlob(blobContent, 'application/msword', 1024)], {});
saveAs(blob, fileName);
}
b64toBlob(b64Data, contentType, sliceSize) {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, { type: contentType });
return blob;
}
}
export enum EnumExceptionLetterTemplateType {
Letter_Template_Staff = 1,
Letter_Template_Worker = 2
}

View File

@ -55,6 +55,7 @@
<div class="card" *ngIf="showPopUp" class="blur-background"> <div class="card" *ngIf="showPopUp" class="blur-background">
<kendo-window [height]="600" title="{{PDFTitle}}" *ngIf="showPopUp" (close)="closeForm()" [style]="{'min-width': '70%','max-width': '100%', 'max-height': '100%'}"> <kendo-window [height]="600" title="{{PDFTitle}}" *ngIf="showPopUp" (close)="closeForm()" [style]="{'min-width': '70%','max-width': '100%', 'max-height': '100%'}">
<app-loading-panel></app-loading-panel>
<div class='embed-responsive'> <div class='embed-responsive'>
<iframe class="pdf-viewer" id="pdf-viewer-ml" type='application/pdf' [zoom]="zoomLevel"></iframe> <iframe class="pdf-viewer" id="pdf-viewer-ml" type='application/pdf' [zoom]="zoomLevel"></iframe>
</div> </div>

View File

@ -60,6 +60,7 @@ export class LetterGenerateComponent implements OnInit {
}; };
} }
this.showPopUp = true; this.showPopUp = true;
this.loadingPanelService.ShowLoadingPanel = true;
this.reportService.getAppointmentLetter(data).subscribe( this.reportService.getAppointmentLetter(data).subscribe(
(resp: any) => { (resp: any) => {
if (this.reportType === 'PDF'){ if (this.reportType === 'PDF'){

View File

@ -13,7 +13,7 @@ export class ApiService {
public isSSO = false; public isSSO = false;
public versionDeployement = false; public versionDeployement = false;
public versionNumber = `V-${GlobalfunctionExtension.generateVersionNumber(new Date(2025, 0, 16))}-`+"01"; public versionNumber = `V-${GlobalfunctionExtension.generateVersionNumber(new Date(2025, 1, 23))}-`+"01";
public static BASE_URL = ''; public static BASE_URL = '';
public base_url = ''; public base_url = '';
// public currentLink = ''; // public currentLink = '';

View File

@ -11,13 +11,25 @@
<app-employee-picker [MultiSelect]="true" <app-employee-picker [MultiSelect]="true"
(ItemSelected)="GetSelectedEmployee($event)"></app-employee-picker> (ItemSelected)="GetSelectedEmployee($event)"></app-employee-picker>
</div> </div>
<div class="rosterAssignmentControls">
<strong>
<label>Roster Type: </label>
</strong>
</div>
<div class="rosterAssignmentControls">
<kendo-dropdownlist [(ngModel)]="selectedWorkPlanTypeIsFixed" [data]="workPlanTypes"
[defaultItem]="{ text: 'Select Roster Type..', value: null }" [textField]="'text'" [valueField]="'value'"
(valueChange)="onChangeWorkPlanType($event)" [valuePrimitive]="true"
class="form-control form-control-sm input-sm" formControlName="type">
</kendo-dropdownlist>
</div>
<div class="rosterAssignmentControls"> <div class="rosterAssignmentControls">
<strong> <strong>
<label>Roster: </label> <label>Roster: </label>
</strong> </strong>
</div> </div>
<div class="rosterAssignmentControls"> <div class="rosterAssignmentControls">
<kendo-dropdownlist [(ngModel)]="selectedWorkPlanID" [data]="workPlanGroupList" <kendo-dropdownlist [(ngModel)]="selectedWorkPlanID" [data]="workPlanGroupListByType"
[defaultItem]="{ name: 'Select..', value: null }" [textField]="'name'" [valueField]="'id'" [defaultItem]="{ name: 'Select..', value: null }" [textField]="'name'" [valueField]="'id'"
(valueChange)="populateEmpWorkPlanByWorkGroup($event)" [valuePrimitive]="true" (valueChange)="populateEmpWorkPlanByWorkGroup($event)" [valuePrimitive]="true"
class="form-control form-control-sm input-sm" formControlName="group"> class="form-control form-control-sm input-sm" formControlName="group">

View File

@ -31,16 +31,23 @@ export class EchotexRosterAssignmentComponent implements OnInit {
workPlanGroupName = ''; workPlanGroupName = '';
workPlanGroupInitialShift = ''; workPlanGroupInitialShift = '';
workPlanGroupList: WorkPlanGroup[]; workPlanGroupList: WorkPlanGroup[];
workPlanGroupListByType: WorkPlanGroup[] = [];
selectedEmployees: SearchEmployee[]; selectedEmployees: SearchEmployee[];
employees: Employee[]; employees: Employee[];
empIds: number[] = []; empIds: number[] = [];
exportExcelFileName: string = ''; exportExcelFileName: string = '';
selectedWorkPlanTypeIsFixed: boolean;
selectedWorkPlanID: number; selectedWorkPlanID: number;
fixedWorkPlan: boolean = true; fixedWorkPlan: boolean = true;
startDate: Date; startDate: Date;
holidayDayOfWeekArray = Object.values(HolidayDayOfWeek); holidayDayOfWeekArray = Object.values(HolidayDayOfWeek);
workPlanTypes: { text: string, value: boolean| null }[] = [
{ text: 'Fixed', value: true },
{ text: 'Counter Clock', value: false }
]
constructor(public employeeService: EmployeeServices, constructor(public employeeService: EmployeeServices,
public attendanceServices: AttendanceServices, public attendanceServices: AttendanceServices,
public apiService: ApiService, public apiService: ApiService,
@ -85,6 +92,7 @@ export class EchotexRosterAssignmentComponent implements OnInit {
createForm() { createForm() {
this.rosterAssignmentForm = new FormBuilder().group({ this.rosterAssignmentForm = new FormBuilder().group({
type: ['', Validators.required],
group: ['', Validators.required], group: ['', Validators.required],
startDate: [''], startDate: [''],
}); });
@ -202,13 +210,13 @@ export class EchotexRosterAssignmentComponent implements OnInit {
this.loadingPanel.ShowLoadingPanel = true; this.loadingPanel.ShowLoadingPanel = true;
this.empWorkPlanSetupList = []; this.empWorkPlanSetupList = [];
debugger; debugger;
if (workPlanGroup.type != EnumWorkPlanGroup.Fixed && // if (workPlanGroup.type != EnumWorkPlanGroup.Fixed &&
(workPlanGroup.type != undefined || workPlanGroup.type != null)) { // (workPlanGroup.type != undefined || workPlanGroup.type != null)) {
this.fixedWorkPlan = false; // this.fixedWorkPlan = false;
this.startDate = new Date(); // this.startDate = new Date();
} else { // } else {
this.fixedWorkPlan = true; // this.fixedWorkPlan = true;
} // }
this.attendanceServices.getEmployeeWorkPlanSetupByWPGroupID(workPlanGroup.id).subscribe( this.attendanceServices.getEmployeeWorkPlanSetupByWPGroupID(workPlanGroup.id).subscribe(
(resp) => { (resp) => {
this.empWorkPlanSetupList = resp; this.empWorkPlanSetupList = resp;
@ -331,7 +339,7 @@ export class EchotexRosterAssignmentComponent implements OnInit {
); );
} }
public getHolidayDayOfWeek( day: number): string { public getHolidayDayOfWeek(day: number): string {
debugger; debugger;
day = day + 1; day = day + 1;
switch (day) { switch (day) {
@ -365,4 +373,23 @@ export class EchotexRosterAssignmentComponent implements OnInit {
// return dayIndex as EnumDayOfWeek; // return dayIndex as EnumDayOfWeek;
// } // }
onChangeWorkPlanType(type: any) {
this.empWorkPlanSetupList = [];
this.workPlanGroupListByType = [];
this.selectedWorkPlanID = null;
this.fixedWorkPlan = true;
if (type == undefined || type == null) {
return;
}
else if (type){
this.workPlanGroupListByType = this.workPlanGroupList.filter(y => y.type == EnumWorkPlanGroup.Fixed);
}
else {
this.workPlanGroupListByType = this.workPlanGroupList.filter(y => y.type != EnumWorkPlanGroup.Fixed);
this.fixedWorkPlan = false;
this.startDate = new Date();
}
}
} }

View File

@ -187,6 +187,16 @@ export class AcademicEntryComponent implements OnInit {
// this.isGrade = false; // this.isGrade = false;
// } // }
} }
let educationType = this.educationTypes.find(x => x.description.toLowerCase() == "academic");
if (this.academic.id == 0 && educationType != undefined) {
this.academic.educationTypeID = educationType.id;
this.selectedEducationTypeID = this.academic.educationTypeID;
this.academic.examDate = new Date().getFullYear();
this.academic.passingYear = new Date().getFullYear();
this.selectEducationTypeEvent(educationType.id);
}
} }
); );
} }
@ -285,7 +295,7 @@ export class AcademicEntryComponent implements OnInit {
educationLevelPicker: ['', Validators.required], educationLevelPicker: ['', Validators.required],
disciplinePicker: ['', Validators.required], disciplinePicker: ['', Validators.required],
institutionPicker: ['', Validators.required], institutionPicker: ['', Validators.required],
resultTypePicker: ['', Validators.required], resultTypePicker: [''],
examHeldOn: ['', Validators.required], examHeldOn: ['', Validators.required],
passingYear: ['', Validators.required], passingYear: ['', Validators.required],
gpaOrMarks: [''], gpaOrMarks: [''],
@ -304,11 +314,12 @@ export class AcademicEntryComponent implements OnInit {
this.selectedResultTypeID = this.academic.resultTypeID; this.selectedResultTypeID = this.academic.resultTypeID;
} }
public onSave(e): void { public onSave(e): void {
debugger;
this.academic.educationTypeID = this.selectedEducationTypeID; this.academic.educationTypeID = this.selectedEducationTypeID;
this.academic.educationLevelID = this.selectedEducationLevelID; this.academic.educationLevelID = this.selectedEducationLevelID;
this.academic.institutionID = this.selectedInstitutionID; this.academic.institutionID = this.selectedInstitutionID;
this.academic.disciplineID = this.selectedDisciplineID; this.academic.disciplineID = this.selectedDisciplineID;
this.academic.resultTypeID = this.selectedResultTypeID; this.academic.resultTypeID = this.selectedResultTypeID != null ? this.selectedResultTypeID : 0;
if (this.employeeService.hrEmployee.id === undefined || this.employeeService.hrEmployee.id === 0) { if (this.employeeService.hrEmployee.id === undefined || this.employeeService.hrEmployee.id === 0) {
this.notificationService.showWarning('please select an employee'); this.notificationService.showWarning('please select an employee');
this.onCancel(null); this.onCancel(null);
@ -320,10 +331,9 @@ export class AcademicEntryComponent implements OnInit {
return; return;
} }
this.academic.createdBy = 0;
this.academic.employeeID = this.employeeService.hrEmployee.id; this.academic.employeeID = this.employeeService.hrEmployee.id;
this.academic.createdDate = new Date(this.academic.createdBy);
this.academic.createdBy = 0; this.academic.createdBy = 0;
this.academic.createdDate = new Date();
this.loadingPanelService.ShowLoadingPanel = true; this.loadingPanelService.ShowLoadingPanel = true;
this.employeeService.saveEmployeeAcademic(this.academic).subscribe( this.employeeService.saveEmployeeAcademic(this.academic).subscribe(
(resp) => { (resp) => {

View File

@ -57,6 +57,21 @@
[(ngModel)]="contact.permanentTelephone" type="text" pInputText style="width:100%"> [(ngModel)]="contact.permanentTelephone" type="text" pInputText style="width:100%">
</div> </div>
<div class="p-col-12 p-md-12 p-lg-3" style="margin: auto;">
<label for="txtPermanentMobilePhone">Mobile Phone</label>
</div>
<div class="p-col-12 p-md-12 p-lg-3">
<input id="txtPermanentMobilePhone" formControlName="permanentMobilePhone"
[(ngModel)]="contact.permanentMobile" type="text" pInputText style="width:100%">
</div>
<div class="p-col-12 p-md-12 p-lg-3">
<label for="txtParmanentPOInBangla">Post Office Name</label>
</div>
<div class="p-col-12 p-md-12 p-lg-3">
<input id="txtParmanentPO" formControlName="parmanentPO"
[(ngModel)]="contact.permanentPO" type="text" pInputText style="width:100%">
</div>
<div class="p-col-12 p-md-12 p-lg-3"> <div class="p-col-12 p-md-12 p-lg-3">
<label for="txtParmanentPOInBangla">Post Office Name (Bn)</label> <label for="txtParmanentPOInBangla">Post Office Name (Bn)</label>
</div> </div>
@ -65,21 +80,15 @@
[(ngModel)]="contact.parmanentPOInBangla" type="text" pInputText style="width:100%"> [(ngModel)]="contact.parmanentPOInBangla" type="text" pInputText style="width:100%">
</div> </div>
<!-- <div class="p-col-12 p-md-12 p-lg-1"></div> -->
<div class="p-col-12 p-md-12 p-lg-3" style="margin: auto;"> <div class="p-col-12 p-md-12 p-lg-3" style="margin: auto;">
<label for="txtPermanentMobilePhone">Mobile Phone</label>
</div>
<div class="p-col-12 p-md-12 p-lg-3">
<input id="txtPermanentMobilePhone" formControlName="permanentMobilePhone"
[(ngModel)]="contact.permanentMobile" type="text" pInputText style="width:100%">
</div>
<div class="p-col-12 p-md-12 p-lg-1"></div>
<div class="p-col-12 p-md-12 p-lg-2" style="margin: auto;">
<label for="txtPermanentPostalCode">Postal Code</label> <label for="txtPermanentPostalCode">Postal Code</label>
</div> </div>
<div class="p-col-12 p-md-12 p-lg-3"> <div class="p-col-12 p-md-12 p-lg-3">
<input id="txtPermanentPostalCode" formControlName="permanentPostalCode" <input id="txtPermanentPostalCode" formControlName="permanentPostalCode"
[(ngModel)]="contact.permanentPostCodeNo" type="text" pInputText style="width:100%"> [(ngModel)]="contact.permanentPostCodeNo" type="text" pInputText style="width:100%">
</div> </div>
<div class="p-lg-6"></div>
<div class="p-col-12 p-md-12 p-lg-12"> <div class="p-col-12 p-md-12 p-lg-12">
<label class="k-form-field right"> <label class="k-form-field right">
<!-- <input type="checkbox" [(ngModel)]="isSameAddress" (change)="checkAddress()" id="isSameAddress" <!-- <input type="checkbox" [(ngModel)]="isSameAddress" (change)="checkAddress()" id="isSameAddress"
@ -155,15 +164,6 @@
[readonly]="this.isSameAddress"> [readonly]="this.isSameAddress">
</div> </div>
<div class="p-col-12 p-md-12 p-lg-3">
<label for="txtPresentPOInBangla">Post Office Name(Bn)</label>
</div>
<div class="p-col-12 p-md-12 p-lg-3">
<input class="bangla-font" id="txtPresentPOInBangla" formControlName="presentPOInBangla"
[(ngModel)]="contact.presentPOInBangla" type="text" pInputText style="width:100%"
[readonly]="this.isSameAddress">
</div>
<div class="p-col-12 p-md-12 p-lg-3" style="margin: auto;"> <div class="p-col-12 p-md-12 p-lg-3" style="margin: auto;">
<label for="txtPresentMobilePhone">Mobile Phone</label> <label for="txtPresentMobilePhone">Mobile Phone</label>
</div> </div>
@ -173,8 +173,27 @@
[readonly]="this.isSameAddress"> [readonly]="this.isSameAddress">
</div> </div>
<div class="p-col-12 p-md-12 p-lg-1"></div> <div class="p-col-12 p-md-12 p-lg-3">
<div class="p-col-12 p-md-12 p-lg-2" style="margin: auto;"> <label for="txtPresentPOInBangla">Post Office Name</label>
</div>
<div class="p-col-12 p-md-12 p-lg-3">
<input id="txtPresentPO" formControlName="presentPO"
[(ngModel)]="contact.presentPO" type="text" pInputText style="width:100%"
[readonly]="this.isSameAddress">
</div>
<div class="p-col-12 p-md-12 p-lg-3">
<label for="txtPresentPOInBangla">Post Office Name (Bn)</label>
</div>
<div class="p-col-12 p-md-12 p-lg-3">
<input class="bangla-font" id="txtPresentPOInBangla" formControlName="presentPOInBangla"
[(ngModel)]="contact.presentPOInBangla" type="text" pInputText style="width:100%"
[readonly]="this.isSameAddress">
</div>
<!-- <div class="p-col-12 p-md-12 p-lg-1"></div> -->
<div class="p-col-12 p-md-12 p-lg-3" style="margin: auto;">
<label for="txtPresentPostalCode">Postal Code</label> <label for="txtPresentPostalCode">Postal Code</label>
</div> </div>
<div class="p-col-12 p-md-12 p-lg-3"> <div class="p-col-12 p-md-12 p-lg-3">
@ -182,6 +201,7 @@
[(ngModel)]="contact.presentPostCodeNo" type="text" pInputText style="width:100%" [(ngModel)]="contact.presentPostCodeNo" type="text" pInputText style="width:100%"
[readonly]="this.isSameAddress"> [readonly]="this.isSameAddress">
</div> </div>
<div class="p-lg-6"></div>
<div class="p-col-12 p-md-12 p-lg-12" style="height: 34px;"> <div class="p-col-12 p-md-12 p-lg-12" style="height: 34px;">
<label class="k-form-field right"> <label class="k-form-field right">
<!-- <input type="checkbox" [(ngModel)]="isSameAddress" (change)="checkAddress()" id="isSameAddress" <!-- <input type="checkbox" [(ngModel)]="isSameAddress" (change)="checkAddress()" id="isSameAddress"

View File

@ -89,6 +89,8 @@ export class ContactComponent implements OnInit {
permanentDistrictDropdown: new FormControl('', Validators.required), permanentDistrictDropdown: new FormControl('', Validators.required),
permanentThanaDropdown: new FormControl('', Validators.required), permanentThanaDropdown: new FormControl('', Validators.required),
permanentPostalCode: new FormControl(''), permanentPostalCode: new FormControl(''),
parmanentPO: new FormControl(''),
parmanentPOInBangla: new FormControl(''),
presentAddress: new FormControl('', Validators.required), presentAddress: new FormControl('', Validators.required),
presentAddressInBangla: new FormControl(''), presentAddressInBangla: new FormControl(''),
@ -97,6 +99,8 @@ export class ContactComponent implements OnInit {
presentDistrictDropdown: new FormControl('', Validators.required), presentDistrictDropdown: new FormControl('', Validators.required),
presentThanaDropdown: new FormControl('', Validators.required), presentThanaDropdown: new FormControl('', Validators.required),
presentPostCode: new FormControl(''), presentPostCode: new FormControl(''),
presentPO: new FormControl(''),
presentPOInBangla: new FormControl(''),
contactLandPhone: new FormControl(''), contactLandPhone: new FormControl(''),
contactMobileNo: new FormControl(''), contactMobileNo: new FormControl(''),
@ -104,14 +108,12 @@ export class ContactComponent implements OnInit {
contactOfficialEmail: new FormControl(''), contactOfficialEmail: new FormControl(''),
contactFax: new FormControl(''), contactFax: new FormControl(''),
emergencyContactPerson: new FormControl('', Validators.required), emergencyContactPerson: new FormControl(''),
emergencyAddress: new FormControl('', Validators.required), emergencyAddress: new FormControl(''),
emergencyLandPhone: new FormControl(''), emergencyLandPhone: new FormControl(''),
emergencyMobileNo: new FormControl('', Validators.required), emergencyMobileNo: new FormControl(''),
relation: new FormControl(''), relation: new FormControl(''),
presentPOInBangla: new FormControl(''),
parmanentPOInBangla: new FormControl(''),
}); });
/* if (this.employeeService.hrEmployee !== undefined && this.employeeService.hrEmployee.contacts.length > 0) { /* if (this.employeeService.hrEmployee !== undefined && this.employeeService.hrEmployee.contacts.length > 0) {
this.contact = this.employeeService.hrEmployee.contacts[0]; this.contact = this.employeeService.hrEmployee.contacts[0];
@ -212,6 +214,7 @@ export class ContactComponent implements OnInit {
this.contact.presentDistrictID = this.contact.permanentDistrictID; this.contact.presentDistrictID = this.contact.permanentDistrictID;
this.contact.presentThanaID = this.contact.permanentThanaID; this.contact.presentThanaID = this.contact.permanentThanaID;
this.contact.presentTelephone = this.contact.permanentTelephone; this.contact.presentTelephone = this.contact.permanentTelephone;
this.contact.presentPO = this.contact.permanentPO;
this.contact.presentPOInBangla = this.contact.parmanentPOInBangla; this.contact.presentPOInBangla = this.contact.parmanentPOInBangla;
this.contact.presentMobile = this.contact.permanentMobile; this.contact.presentMobile = this.contact.permanentMobile;
this.contact.presentPostCodeNo = this.contact.permanentPostCodeNo; this.contact.presentPostCodeNo = this.contact.permanentPostCodeNo;

View File

@ -27,7 +27,9 @@
<p-tabView [scrollable]="true"> <p-tabView [scrollable]="true">
<p-tabPanel header="General" leftIcon="pi pi-user"> <p-tabPanel header="General" leftIcon="pi pi-user">
<app-general [isActive]="!newEmployee" [employeeNo]="this.employeeService.hrEmployee.employeeNo"></app-general> <app-general [isActive]="!newEmployee" [employeeNo]="this.employeeService.hrEmployee.employeeNo"
(defaultNationalityHandler)="defaultNationalityHandler($event)"
(defaultEmployeeTypeHandler)="defaultEmployeeTypeHandler($event)"></app-general>
</p-tabPanel> </p-tabPanel>
<p-tabPanel header="Contacts" leftIcon="pi pi-phone"> <p-tabPanel header="Contacts" leftIcon="pi pi-phone">
<app-contact (saveContact)="saveContact($event)"></app-contact> <app-contact (saveContact)="saveContact($event)"></app-contact>

View File

@ -1,16 +1,18 @@
import {Component, OnInit} from '@angular/core'; import { Component, OnInit } from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import {EmployeeServices} from '../../_services/employee/employee.service'; import { EmployeeServices } from '../../_services/employee/employee.service';
import {empFileuploads, HrEmployee} from '../../_models/HREmployee/hrEmployee'; import { empFileuploads, HrEmployee } from '../../_models/HREmployee/hrEmployee';
import {SearchEmployee} from '../../_models/Employee/searchEmployee'; import { SearchEmployee } from '../../_models/Employee/searchEmployee';
import {DataTransferService} from '../../data.transfer.service'; import { DataTransferService } from '../../data.transfer.service';
import {BasicService} from '../../_services/Basic/basic.service'; import { BasicService } from '../../_services/Basic/basic.service';
import {enumEmpFileUploadType, EnumExtension, EnumGender, EnumStatus} from '../../_models/enums'; import { enumEmpFileUploadType, EnumExtension, EnumGender, EnumStatus } from '../../_models/enums';
import {EmpContact} from '../../_models/HREmployee/empContact'; import { EmpContact } from '../../_models/HREmployee/empContact';
import {ApiService} from '../../app.api.service'; import { ApiService } from '../../app.api.service';
import {loadingPanelService} from '../../hrm-loding panel/loding.panel.service'; import { loadingPanelService } from '../../hrm-loding panel/loding.panel.service';
import {HRMNotificationService} from '../../app.notification.service'; import { HRMNotificationService } from '../../app.notification.service';
import {DomSanitizer} from '@angular/platform-browser'; import { DomSanitizer } from '@angular/platform-browser';
import { Nationality } from '../nationality/nationality';
import { Category } from 'src/app/_models/Basic/category';
@Component({ @Component({
selector: 'app-employee-profile', selector: 'app-employee-profile',
@ -30,6 +32,8 @@ export class EmployeeProfileComponent implements OnInit {
attachment: any; attachment: any;
fileType = ''; fileType = '';
isDisplay = false; isDisplay = false;
defaultNationality: Nationality;
defaultEmployeeType: Category;
constructor(private fb: FormBuilder, constructor(private fb: FormBuilder,
public employeeService: EmployeeServices, public employeeService: EmployeeServices,
public basicService: BasicService, public basicService: BasicService,
@ -261,6 +265,12 @@ export class EmployeeProfileComponent implements OnInit {
this.employeeService.hrEmployee.passportExpDate = new Date(this.employeeService.hrEmployee.passportExpDate); this.employeeService.hrEmployee.passportExpDate = new Date(this.employeeService.hrEmployee.passportExpDate);
this.employeeService.hrEmployee.passportIssueDate = new Date(this.employeeService.hrEmployee.passportIssueDate); this.employeeService.hrEmployee.passportIssueDate = new Date(this.employeeService.hrEmployee.passportIssueDate);
} }
else {
this.hrEmployeeProfile.birthDate = new Date();
this.hrEmployeeProfile.joiningDate = new Date();
this.hrEmployeeProfile.nationalityID = this.defaultNationality != null ? this.defaultNationality.id : null;
this.hrEmployeeProfile.categoryID = this.defaultEmployeeType != null ? this.defaultEmployeeType.id : null;
}
this.employeeService.Employee_Get_Completed.next(this.hrEmployeeProfile); this.employeeService.Employee_Get_Completed.next(this.hrEmployeeProfile);
} }
@ -292,12 +302,12 @@ export class EmployeeProfileComponent implements OnInit {
this.contact = item; this.contact = item;
} }
editHandler({dataItem}) { editHandler({ dataItem }) {
this.isDisplay = true; this.isDisplay = true;
const item = dataItem as empFileuploads; const item = dataItem as empFileuploads;
this.attachment = item.fileData; this.attachment = item.fileData;
const type = item.fileName.split('.').pop(); const type = item.fileName.split('.').pop();
if ( type === 'png' || type === 'jpg' || type === 'jpeg') { if (type === 'png' || type === 'jpg' || type === 'jpeg') {
this.fileType = 'image'; this.fileType = 'image';
} }
else if (type === 'pdf') { else if (type === 'pdf') {
@ -308,5 +318,12 @@ export class EmployeeProfileComponent implements OnInit {
onPopUpClose() { onPopUpClose() {
this.isDisplay = false; this.isDisplay = false;
} }
defaultNationalityHandler(dataItem: Nationality) {
this.defaultNationality = dataItem;
}
defaultEmployeeTypeHandler(dataItem: Category) {
this.defaultEmployeeType = dataItem;
}
} }

View File

@ -67,6 +67,7 @@ export class ChildrenListComponent implements OnInit {
addNew() { addNew() {
this.editIndex = -1; this.editIndex = -1;
this.empChildren = new EmpChildren(); this.empChildren = new EmpChildren();
this.empChildren.birthDate = new Date();
this.isDisplay = true; this.isDisplay = true;
} }

View File

@ -68,6 +68,7 @@ export class SpouseListComponent implements OnInit {
addNew() { addNew() {
this.editIndex = -1; this.editIndex = -1;
this.empSpouse = new EmpSpouse(); this.empSpouse = new EmpSpouse();
this.empSpouse.marriageDate = new Date();
this.isDisplay = true; this.isDisplay = true;
} }

View File

@ -1,4 +1,4 @@
import { Component, Input, OnInit } from '@angular/core'; import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms'; import { FormControl, FormGroup, Validators } from '@angular/forms';
import { DataTransferService } from '../../../data.transfer.service'; import { DataTransferService } from '../../../data.transfer.service';
import { EmployeeServices } from '../../../_services/employee/employee.service'; import { EmployeeServices } from '../../../_services/employee/employee.service';
@ -115,6 +115,7 @@ export class GeneralComponent implements OnInit {
pickerEmployee: SearchEmployee; pickerEmployee: SearchEmployee;
nationalities: Nationality[]; nationalities: Nationality[];
defaultNationality: Nationality; defaultNationality: Nationality;
defaultEmployeeType: Category;
nameBangla: string = 'asasas'; nameBangla: string = 'asasas';
defaultPhoto = "assets/photos/profile-default.jpg"; defaultPhoto = "assets/photos/profile-default.jpg";
photoPath = "Documents/EMPPHOTO"; photoPath = "Documents/EMPPHOTO";
@ -126,6 +127,8 @@ export class GeneralComponent implements OnInit {
permanentThanas: Thana[]; permanentThanas: Thana[];
isAccessCard: boolean = false; isAccessCard: boolean = false;
@Output() defaultNationalityHandler = new EventEmitter<Nationality>();
@Output() defaultEmployeeTypeHandler = new EventEmitter<Category>();
constructor(public employeeService: EmployeeServices, public basicService: BasicService, constructor(public employeeService: EmployeeServices, public basicService: BasicService,
public notificationService: HRMNotificationService, public notificationService: HRMNotificationService,
@ -156,6 +159,11 @@ export class GeneralComponent implements OnInit {
}, },
() => { () => {
this.defaultEmployeeType = this.employeeTypes.find(x => x.name.toLowerCase() == "worker");
if (this.defaultEmployeeType != undefined) {
// this.hrEmployee.categoryID = this.defaultEmployeeType.id;
this.defaultEmployeeTypeHandler.emit(this.defaultEmployeeType);
}
} }
); );
@ -178,7 +186,8 @@ export class GeneralComponent implements OnInit {
() => { () => {
this.defaultNationality = this.nationalities.find(x => x.description.toLowerCase() == "bangladeshi"); this.defaultNationality = this.nationalities.find(x => x.description.toLowerCase() == "bangladeshi");
if (this.defaultNationality) { if (this.defaultNationality) {
this.hrEmployee.nationalityID = this.defaultNationality.id; // this.hrEmployee.nationalityID = this.defaultNationality.id;
this.defaultNationalityHandler.emit(this.defaultNationality);
} }
} }
); );
@ -460,7 +469,7 @@ export class GeneralComponent implements OnInit {
// } // }
this.employeeService.saveHrPersonalInfo(this.hrEmployee).subscribe( this.employeeService.saveHrPersonalInfo(this.hrEmployee).subscribe(
(resp: HrEmployee) => { (resp: HrEmployee) => {
if(resp != undefined){ if (resp != undefined) {
this.hrEmployee.id = resp.id; this.hrEmployee.id = resp.id;
if (this.active == false) { if (this.active == false) {
this.hrEmployee.employeeNo = resp.employeeNo; this.hrEmployee.employeeNo = resp.employeeNo;

View File

@ -86,6 +86,7 @@ export class NomineeListComponent implements OnInit {
this.editIndex = -1; this.editIndex = -1;
this.nominee = new EmpNominee(); this.nominee = new EmpNominee();
this.nominee.employeeID = this.employeeService.hrEmployee.id; this.nominee.employeeID = this.employeeService.hrEmployee.id;
this.nominee.percentage = 100;
this.isDisplay = true; this.isDisplay = true;
} }
public editHandler(rowIndex: any) { public editHandler(rowIndex: any) {

View File

@ -53,7 +53,7 @@
</div> </div>
<div class="p-col-12 p-md-6 p-lg-8 form-control-lg form-control"> <div class="p-col-12 p-md-6 p-lg-8 form-control-lg form-control">
<input id="txtMailAddress" type="text" style="width:100%" <input id="txtMailAddress" type="text" style="width:100%"
[(ngModel)]="employee.emailAddress" formControlName="emailAddress" pInputText required> [(ngModel)]="employee.emailAddress" formControlName="emailAddress" pInputText>
</div> </div>
<div class="p-col-12 p-md-6 p-lg-4" style="margin:auto"> <div class="p-col-12 p-md-6 p-lg-4" style="margin:auto">

View File

@ -137,6 +137,8 @@ export class EmployeePayrollProfileComponent implements OnInit {
this.lastSalaryProcessDate(); this.lastSalaryProcessDate();
this.selectedCategoryid = this.ddlcategories.find(x => x.name.toLowerCase() == "worker").id;
// this.loadingPanelService.ShowLoadingPanel = true; // this.loadingPanelService.ShowLoadingPanel = true;
// this.employeeService.generateEmployeeNo().subscribe( // this.employeeService.generateEmployeeNo().subscribe(
// (resp) => { // (resp) => {
@ -153,6 +155,7 @@ export class EmployeePayrollProfileComponent implements OnInit {
} }
else { else {
this.employee.employeeNo = undefined; this.employee.employeeNo = undefined;
this.selectedCategoryid = undefined;
} }
} }

View File

@ -30,6 +30,7 @@ import { PayrollType } from '../../../_models/Authentication/payrollType';
import { GrievanceManagementService } from '../../../_services/grievance-management/grievanceManagement.service'; import { GrievanceManagementService } from '../../../_services/grievance-management/grievanceManagement.service';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { WorkflowService } from '../../../_services/workflow/workflow.service'; import { WorkflowService } from '../../../_services/workflow/workflow.service';
import { AuthService } from '../../../_services/auth/auth.service';
@Component({ @Component({
@ -77,6 +78,8 @@ export class LifeCycleEntryComponent implements OnInit {
this.empPickerActive = false; this.empPickerActive = false;
} }
_effectDate: Date = undefined; _effectDate: Date = undefined;
public payrollType: PayrollType = undefined;
public salaryMonth: Date = new Date();
public empPickerActive: boolean = true; public empPickerActive: boolean = true;
public isDesingation: boolean = false; public isDesingation: boolean = false;
public isDepartment: boolean = false; public isDepartment: boolean = false;
@ -104,6 +107,7 @@ export class LifeCycleEntryComponent implements OnInit {
public utilityHandlerService: UntilityHandlerService, public organogramService: OrganogramService, public utilityHandlerService: UntilityHandlerService, public organogramService: OrganogramService,
public loadingPanelService: loadingPanelService, public loadingPanelService: loadingPanelService,
public router: Router, public workflowService: WorkflowService, public router: Router, public workflowService: WorkflowService,
public authservice: AuthService,
public acrouter: ActivatedRoute,) { public acrouter: ActivatedRoute,) {
if (this.router.url === '/payroll/career-and-profile/life-cycle-entry') if (this.router.url === '/payroll/career-and-profile/life-cycle-entry')
this.apiservice.selectedMenuName = 'Employee Life Cycle'; this.apiservice.selectedMenuName = 'Employee Life Cycle';
@ -135,7 +139,16 @@ export class LifeCycleEntryComponent implements OnInit {
} }
); );
this.authservice.GetPayrollTypeByLoginID().subscribe(
(resp: any) => {
this.payrollType = resp;
},
(err: any) => {
},
() => {
this.salaryMonth = new Date(this.payrollType.nextPayProcessDate);
}
);
} }
private refreshGradeSalaries() { private refreshGradeSalaries() {
@ -173,7 +186,7 @@ export class LifeCycleEntryComponent implements OnInit {
} }
EventselectionChange(value: any) { EventselectionChange(value: any) {
debugger;
this.isDesingation = false; this.isDesingation = false;
this.isDepartment = false; this.isDepartment = false;
this.isCategory = false; this.isCategory = false;
@ -292,6 +305,16 @@ export class LifeCycleEntryComponent implements OnInit {
}); });
this._sDescription = item.description; this._sDescription = item.description;
if(this._employeeStatus != undefined && this._employeeStatus.length > 0)
if(item == this._employeeStatus.find(x => x.description.toLowerCase() == 'joining') ){
this._effectDate = new Date(this._employee.joiningDate);
}
else {
debugger;
// let currentDate: Date = new Date();
let currentDate: Date = this.salaryMonth;
this._effectDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);
}
} }
} }

View File

@ -11,11 +11,13 @@ using AutoMapper.Configuration;
using Google.Protobuf.WellKnownTypes; using Google.Protobuf.WellKnownTypes;
using HRM.BO; using HRM.BO;
using HRM.DA; using HRM.DA;
using HRM.Report;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles; using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using NPOI.HPSF;
using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Ocsp; using Org.BouncyCastle.Ocsp;
using static HRM.Report.PayrollDataSet.PayrollDataSet; using static HRM.Report.PayrollDataSet.PayrollDataSet;
@ -783,6 +785,88 @@ namespace HRM.UI.Controllers
} }
[HttpPost("generatedExceptiinLetter/{letterType}")]
public ActionResult generatedExceptiinLetter(int letterType, List<SearchEmployee> employees)
{
CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
//string downloadPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + @"\Downloads";
string downloadPath = System.Environment.CurrentDirectory + "\\Documents\\LetterTempFolder\\";
string lFileName = string.Empty;
//List<string> sFilePaths = new List<string>();
List<Tuple<byte[], string, string>> filesWithContents = new List<Tuple<byte[], string, string>>();
List<FileContentResult> files = new List<FileContentResult>();
LetterTemplte ltemplate = new LetterTemplte();
byte[] bytes = null;
try
{
if (letterType == 1)
{
ltemplate.SetObjectID(FixedLetterTemplte.Staff_Appointment_Letter);
ltemplate.ID = 2;
ltemplate.Description = "Letter Template Staff";
ltemplate.Subject = "Letter Template Staff";
ltemplate.Type = EnumDocType.Desktop_Letter;
ltemplate.TypeID = (int)EnumDocType.Desktop_Letter;
lFileName = "Staff.doc";
}
else
{
ltemplate.SetObjectID(FixedLetterTemplte.Worker_Appointment_Letter);
ltemplate.ID = 3;
ltemplate.Description = "Letter Template Worker";
ltemplate.Subject = "Letter Template Worker";
ltemplate.Type = EnumDocType.Desktop_Letter;
ltemplate.TypeID = (int)EnumDocType.Desktop_Letter;
lFileName = "Worker.doc";
}
if (employees != null && employees.Count > 0)
{
foreach (var emp in employees)
{
string sFilePath = new rptEmployee().Generate(ltemplate, emp.EmployeeID, payrollTypeId, downloadPath, lFileName);
byte[] buffer = new byte[16 * 1024];
buffer = System.IO.File.ReadAllBytes(sFilePath);
string contentType = GetFileType(sFilePath);
var name = lFileName;
if (System.IO.File.Exists(sFilePath))
{
System.IO.File.Delete(sFilePath);
}
//sFilePaths.Add(sFilePath);
filesWithContents.Add(new Tuple<byte[], string, string>(buffer, emp.EmployeeNo + "_" + name, contentType));
var file = File(buffer, contentType, emp.EmployeeNo + "_" + name);
//return file;
files.Add(file);
}
}
//return Ok(filesWithContents);
return Ok(files);
}
catch (Exception e)
{
return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
}
return Ok();
}
} }
} }