diff --git a/HRM.BO/HRBasic/Enums.cs b/HRM.BO/HRBasic/Enums.cs index 703f1c1..90f48c2 100644 --- a/HRM.BO/HRBasic/Enums.cs +++ b/HRM.BO/HRBasic/Enums.cs @@ -1477,16 +1477,16 @@ namespace HRM.BO public enum EnumBloodGroup { - None = 0, - APos = 1, - ANeg = 2, - BPos = 3, - BNeg = 4, - OPos = 5, - ONeg = 6, - ABPos = 7, - ABNeg = 8, - NA = 9 + NA = 0, + None = 1, + APos = 2, + ANeg = 3, + BPos = 4, + BNeg = 5, + OPos = 6, + ONeg = 7, + ABPos = 8, + ABNeg = 9 } diff --git a/HRM.BO/HREmployee/HREmployee.cs b/HRM.BO/HREmployee/HREmployee.cs index 37c0921..bfb004a 100644 --- a/HRM.BO/HREmployee/HREmployee.cs +++ b/HRM.BO/HREmployee/HREmployee.cs @@ -259,7 +259,9 @@ namespace HRM.BO public Relation ContactPersonRelation { get; set; } public string PermanentAddressInBangla { get; set; } public string PresentAddressInBangla { get; set; } + public string PresentPO { get; set; } public string PresentPOInBangla { get; set; } + public string PermanentPO { get; set; } public string ParmanentPOInBangla { get; set; } //#region Property PermanentDistrict : District @@ -989,6 +991,7 @@ namespace HRM.BO _telePhone = string.Empty; _emailAddress = string.Empty; + Gender = EnumGender.None; } #endregion @@ -1138,6 +1141,14 @@ namespace HRM.BO } #endregion + public string FatherName { get; set; } + public string MotherName { get; set; } + public string SpouseName { get; set; } + public string NationalID{ get; set; } + public EnumGender Gender { get; set; } + public int? DistrictID{ get; set; } + public int? ThanaID { get; set; } + public string PostOffice { get; set; } public EnumProfileStatus ProfileStatus { get; set; } public string NomineeStatus { get; set; } public bool HasPicture { get; set; } @@ -1309,8 +1320,8 @@ namespace HRM.BO #endregion //CGPA or Marks #region GPAOrMarks - private double _gpa; - public double GPAOrMarks + private double? _gpa; + public double? GPAOrMarks { get { return _gpa; } set { _gpa = value; } @@ -1319,8 +1330,8 @@ namespace HRM.BO //OutOf #region Property OutOf : double - private double _outOf; - public double OutOf + private double? _outOf; + public double? OutOf { get { return _outOf; } set { _outOf = value; } diff --git a/HRM.DA/DA/HREmployee/HREmployeeDA.cs b/HRM.DA/DA/HREmployee/HREmployeeDA.cs index d481f42..6ef55e9 100644 --- a/HRM.DA/DA/HREmployee/HREmployeeDA.cs +++ b/HRM.DA/DA/HREmployee/HREmployeeDA.cs @@ -4,6 +4,7 @@ using Ease.Core.DataAccess; using HRM.BO; using Microsoft.AspNetCore.Routing.Template; using Microsoft.Data.SqlClient; +using Org.BouncyCastle.Asn1.X509; namespace HRM.DA { @@ -434,12 +435,12 @@ namespace HRM.DA "EmployeeID, ContactID, PARMANENTADDRESS, PARMANENTDISTRICTID, PARMANENTTHANAID, PARMANENTTELEPHONE," + " PresentAddress, PresentDistrictID, PresentThanaID, PresentTelephone, Mobile, PersonalEmail," + " 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(" + " %n, %n, %s, %n, %n, %s, " + " %s, %n, %n, %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), DataReader.GetNullValue(item.PermanentThanaID, 0), item.PermanentTelephone, item.PresentAddress, DataReader.GetNullValue(item.PresentDistrictID, 0), @@ -448,7 +449,7 @@ namespace HRM.DA item.EmergencyTelephone, DataReader.GetNullValue(item.PermanentMobile), DataReader.GetNullValue(item.PresentMobile), DataReader.GetNullValue(item.PersonalTelephone), 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); } @@ -459,7 +460,7 @@ namespace HRM.DA "PARMANENTADDRESS =%s , PARMANENTDISTRICTID =%n, PARMANENTTHANAID =%n, PARMANENTTELEPHONE=%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, " + - " 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 ", item.PermanentAddress, DataReader.GetNullValue(item.PermanentDistrictID, 0), DataReader.GetNullValue(item.PermanentThanaID, 0), item.PermanentTelephone, @@ -469,7 +470,7 @@ namespace HRM.DA item.EmergencyTelephone, DataReader.GetNullValue(item.PermanentMobile), DataReader.GetNullValue(item.PresentMobile), DataReader.GetNullValue(item.PersonalTelephone), 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); } @@ -588,8 +589,8 @@ namespace HRM.DA academic.ID, academic.EmployeeID, academic.EducationLevelID, DataReader.GetNullValue(academic.DisciplineID, 0), DataReader.GetNullValue(academic.InstitutionID, 0), DataReader.GetNullValue(academic.PassingYear), - DataReader.GetNullValue(academic.ClassOrDivision), academic.GPAOrMarks, academic.LastLevel, - academic.OutOf, DataReader.GetNullValue(academic.ResultTypeID, 0), + DataReader.GetNullValue(academic.ClassOrDivision), DataReader.GetNullValue(academic.GPAOrMarks), academic.LastLevel, + DataReader.GetNullValue(academic.OutOf), DataReader.GetNullValue(academic.ResultTypeID), DataReader.GetNullValue(academic.InstituteName), DataReader.GetNullValue(academic.EducationTypeID, 0), academic.PhotoPath, academic.DocSubmissionDate, academic.ProfileStatus); } @@ -602,8 +603,8 @@ namespace HRM.DA " where AcademicID =%n and EmployeeID =%n ", academic.EducationLevelID, DataReader.GetNullValue(academic.DisciplineID, 0), DataReader.GetNullValue(academic.InstitutionID, 0), DataReader.GetNullValue(academic.PassingYear), - DataReader.GetNullValue(academic.ClassOrDivision), academic.GPAOrMarks, academic.LastLevel, - academic.OutOf, DataReader.GetNullValue(academic.ResultTypeID, 0), + DataReader.GetNullValue(academic.ClassOrDivision), DataReader.GetNullValue(academic.GPAOrMarks), academic.LastLevel, + DataReader.GetNullValue(academic.OutOf), DataReader.GetNullValue(academic.ResultTypeID), DataReader.GetNullValue(academic.InstituteName), DataReader.GetNullValue(academic.EducationTypeID, 0), academic.PhotoPath, academic.DocSubmissionDate, academic.ProfileStatus, academic.ID, academic.EmployeeID); @@ -676,16 +677,16 @@ namespace HRM.DA tc.ExecuteNonQuery("INSERT INTO EmpNominee(" + "EmployeeID, NomineeID, NominationPurposeID, NominationDate, Name, RelationID, " + " Percentage, BirthDate, OccupationID, Address, TelePhone," + - " EmailAddress, NomineeMobileNo)" + + " EmailAddress, NomineeMobileNo, FatherName , MotherName , SpouseName , GENDER , DistrictID , ThanaID , PostOffice)" + " VALUES(" + " %n, %n, %n, %d, %s, %n," + - " %n, %d, %n, %s, %s, %s, %s)", + " %n, %d, %n, %s, %s, %s, %s, %s, %s, %s, %n, %n, %n, %s)", nominee.EmployeeID, nominee.ID, nominee.NominationPurposeID, DataReader.GetNullValue(nominee.NominationDate), nominee.Name, DataReader.GetNullValue(nominee.RelationID, 0), nominee.Percentage, DataReader.GetNullValue(nominee.BirthDate), DataReader.GetNullValue(nominee.OccupationID, 0), nominee.Address, nominee.TelePhone, - nominee.EmailAddress, nominee.NomineeMobileNo); + nominee.EmailAddress, nominee.NomineeMobileNo, nominee.FatherName, nominee.MotherName, nominee.SpouseName, nominee.Gender, nominee.DistrictID, nominee.ThanaID, nominee.PostOffice); } public static void Update(TransactionContext tc, EmpNominee nominee) @@ -701,8 +702,16 @@ namespace HRM.DA ,[TELEPHONE] = %s ,[EMAILADDRESS] = %s ,[NomineeMobileNo] = %s + ,[FatherName] = %s + ,[MotherName] = %s + ,[SpouseName] = %s + ,[Gender] = %n + ,[DistrictID] = %n + ,[ThanaID] = %n + ,[PostOffice] = %s WHERE NOMINEEID = %n", nominee.ID, nominee.NominationPurposeID, nominee.Name, nominee.RelationID, nominee.Percentage, nominee.OccupationID, nominee.Address, nominee.TelePhone, nominee.EmailAddress, nominee.NomineeMobileNo, + nominee.FatherName, nominee.MotherName, nominee.SpouseName, nominee.Gender, nominee.DistrictID, nominee.ThanaID, nominee.PostOffice, nominee.ID); } @@ -960,6 +969,13 @@ namespace HRM.DA ,[IsMinor] ,[NID] ,[NIDPath] + ,[FatherName] + ,[MotherName] + ,[SpouseName] + ,[Gender] + ,[DistrictID] + ,[ThanaID] + ,[PostOffice] ,iif(isnull(eu.empfileuploadid, 0) > 0, 1, 0) HasPicture ,iif(isnull(eu2.empfileuploadid, 0) > 0, 1, 0) HasSignature from [EMPNOMINEE] en diff --git a/HRM.DA/DA/SearchReport/SearchEmployeeDA.cs b/HRM.DA/DA/SearchReport/SearchEmployeeDA.cs index 899fe5d..5448128 100644 --- a/HRM.DA/DA/SearchReport/SearchEmployeeDA.cs +++ b/HRM.DA/DA/SearchReport/SearchEmployeeDA.cs @@ -376,7 +376,7 @@ END;"; //Using TOP sqlClause = SQLParser.TagSQL(sqlClause) + SQLParser.MakeSQL("EmployeeNo LIKE %s", ( code + "%")); orderby = "EmployeeNo"; - top = "TOP 50"; + top = "TOP 15"; //Without suggestion //sqlClause = SQLParser.TagSQL(sqlClause) + SQLParser.MakeSQL("EmployeeNo = %s", code ); @@ -385,9 +385,16 @@ END;"; if (name != string.Empty) 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( - "%q Select %q EmployeeID, EmployeeNo, Name, categoryID, GradeID, LocationID, designationid, DepartmentID From Employee %q %q Order by %s", - recurSqlClause, top, sqlClause, recurWhereClause, orderby); + "%q Select %q EmployeeID, EmployeeNo, Name, categoryID, GradeID, LocationID, designationid, DepartmentID From Employee %q %q " + + " 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); } diff --git a/HRM.DA/Service/HREmployee/HREmployeeService.cs b/HRM.DA/Service/HREmployee/HREmployeeService.cs index daf95fc..6801d09 100644 --- a/HRM.DA/Service/HREmployee/HREmployeeService.cs +++ b/HRM.DA/Service/HREmployee/HREmployeeService.cs @@ -254,6 +254,8 @@ namespace HRM.DA oEmpContact.ProfileStatus = (EnumProfileStatus)oReader.GetInt32("ProfileStatus").GetValueOrDefault(); oEmpContact.PresentPOInBangla = oReader.GetString("PresentPOInBangla", 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); } @@ -556,6 +558,16 @@ namespace HRM.DA oEmpNominee.HasPicture = oReader.GetBoolean("HasPicture", true, false); oEmpNominee.HasSignature = oReader.GetBoolean("HasSignature", true, false); + oEmpNominee.FatherName = oReader.GetString("FatherName"); + oEmpNominee.MotherName = oReader.GetString("MotherName"); + oEmpNominee.SpouseName = oReader.GetString("SpouseName"); + oEmpNominee.NationalID = oReader.GetString("NID"); + oEmpNominee.Gender = (EnumGender)oReader.GetInt32("Gender", 0); + oEmpNominee.DistrictID = oReader.GetInt32("DistrictID").HasValue ? oReader.GetInt32("DistrictID").Value : null; + oEmpNominee.ThanaID = oReader.GetInt32("ThanaID").HasValue ? oReader.GetInt32("ThanaID").Value : null; + oEmpNominee.PostOffice = oReader.GetString("PostOffice"); + + this.SetObjectState(oEmpNominee, ObjectState.Saved); } @@ -596,8 +608,8 @@ namespace HRM.DA oEmpAcademic.ProfileStatus = (EnumProfileStatus)oReader.GetInt32("ProfileStatus", 0); oEmpAcademic.ResultTypeID = oReader.GetInt32("ResultTypeID", 0); - oEmpAcademic.GPAOrMarks = oReader.GetDouble("GPAOrMarks", 0); - oEmpAcademic.OutOf = oReader.GetDouble("OutOf", 0); + oEmpAcademic.GPAOrMarks = oReader.GetDouble("OutOf").HasValue ? oReader.GetDouble("GPAOrMarks") : null; + oEmpAcademic.OutOf = oReader.GetDouble("OutOf").HasValue ? oReader.GetDouble("OutOf") : null; oEmpAcademic.LastLevel = oReader.GetBoolean("LastLevel", false); oEmpAcademic.InstituteName = oReader.GetString("InstituteName"); oEmpAcademic.PhotoPath = oReader.GetString("PhotoPath"); diff --git a/HRM.UI/ClientApp/src/app/_models/HREmployee/empContact.ts b/HRM.UI/ClientApp/src/app/_models/HREmployee/empContact.ts index e7972d6..a7224f8 100644 --- a/HRM.UI/ClientApp/src/app/_models/HREmployee/empContact.ts +++ b/HRM.UI/ClientApp/src/app/_models/HREmployee/empContact.ts @@ -36,7 +36,9 @@ export class EmpContact extends BaseObject { presentAddressInBangla: string; permanentPostCodeNo: string; presentPostCodeNo: string; + presentPO: string; presentPOInBangla: string; + permanentPO: string; parmanentPOInBangla: string; constructor() { super(); diff --git a/HRM.UI/ClientApp/src/app/_models/HREmployee/empNominee.ts b/HRM.UI/ClientApp/src/app/_models/HREmployee/empNominee.ts index 129f272..c07d01c 100644 --- a/HRM.UI/ClientApp/src/app/_models/HREmployee/empNominee.ts +++ b/HRM.UI/ClientApp/src/app/_models/HREmployee/empNominee.ts @@ -1,7 +1,7 @@ import {NominationPurpose} from '../HRBasic/nomination-purpose'; import {Relation} from '../HRBasic/relation'; import {Occupation} from '../HRBasic/occupation'; -import {EnumProfileStatus} from '../enums'; +import {EnumProfileStatus, EnumGender} from '../enums'; import {BaseObject} from '../Basic/baseObject'; import {empFileuploads} from './hrEmployee'; @@ -24,6 +24,14 @@ export class EmpNominee extends BaseObject { signature: empFileuploads; emailAddress: string; profileStatus: EnumProfileStatus; + fatherName: string; + motherName: string; + spouseName: string; + nationalID: string; + gender: EnumGender; + districtID?: number | null; + thanaID?: number | null; + postOffice: string; hasPicture: boolean; hasSignature: boolean; constructor() { diff --git a/HRM.UI/ClientApp/src/app/_models/enums.ts b/HRM.UI/ClientApp/src/app/_models/enums.ts index 716fb0b..853e1cb 100644 --- a/HRM.UI/ClientApp/src/app/_models/enums.ts +++ b/HRM.UI/ClientApp/src/app/_models/enums.ts @@ -998,6 +998,7 @@ export enum EnumTrainingCompletedFrom { } export enum EnumBloodGroup { + NA, None, APos, ANeg, @@ -1006,7 +1007,7 @@ export enum EnumBloodGroup { OPos, ONeg, ABPos, - ABNeg, + ABNeg } export enum EnumOGPositionType { @@ -3149,14 +3150,15 @@ export enum EnumSuccessorReadiness { } export let BloodGroupList = [ - { name: "A+", value: 1 }, - { name: "A-", value: 2 }, - { name: "B+", value: 3 }, - { name: "B-", value: 4 }, - { name: "O+", value: 5 }, - { name: "O-", value: 6 }, - { name: "AB+", value: 7 }, - { name: "AB-", value: 8 }, + { name: "N/A", value: 1 }, + { name: "A+", value: 2 }, + { name: "A-", value: 3 }, + { name: "B+", value: 4 }, + { name: "B-", value: 5 }, + { name: "O+", value: 6 }, + { name: "O-", value: 7 }, + { name: "AB+", value: 8 }, + { name: "AB-", value: 9 }, ]; export class EnumExtension { diff --git a/HRM.UI/ClientApp/src/app/_services/letter-request/letter-request.service.ts b/HRM.UI/ClientApp/src/app/_services/letter-request/letter-request.service.ts index df63f04..bc4fabe 100644 --- a/HRM.UI/ClientApp/src/app/_services/letter-request/letter-request.service.ts +++ b/HRM.UI/ClientApp/src/app/_services/letter-request/letter-request.service.ts @@ -11,6 +11,7 @@ import { EnumLetterOrganizationType } from '../../_models/enums'; import { LetterRequest } from '../../_models/Letter-Request/Letter-Request'; import { AuthorizedPerson } from '../../adhoc-feature/authorized-persons/authorizedPerson'; import { WFMovementTran } from '../../_models/Work-Flow/wFMovementTran'; +import { SearchEmployee } from 'src/app/_models/Employee/searchEmployee'; @Injectable({ providedIn: 'root' @@ -233,6 +234,10 @@ export class LetterRequestService { getImage(id: number) { return this.apiService.httpGet('/LetterRequest/getImage' + '/' + id); } + generatedExceptiinLetter(type: number, param: SearchEmployee[]) { + return this.apiService.httpPost('/LetterRequest/generatedExceptiinLetter/' + type , param); + // return this.apiService.httpDownloadFile('/LetterRequest/generatedExceptiinLetter/' + type , param); + } } diff --git a/HRM.UI/ClientApp/src/app/adhoc-feature/adhoc-feature-routing.module.ts b/HRM.UI/ClientApp/src/app/adhoc-feature/adhoc-feature-routing.module.ts index 6fa10ca..be0ae26 100644 --- a/HRM.UI/ClientApp/src/app/adhoc-feature/adhoc-feature-routing.module.ts +++ b/HRM.UI/ClientApp/src/app/adhoc-feature/adhoc-feature-routing.module.ts @@ -19,6 +19,7 @@ import {LetterRequestByAdminApprovalComponent} from './letter-request-by-admin-a import {ApproveFinancialDataComponent} from './approve-financial-data/approve-financial-data.component'; import {AuthorizedPersonsComponent} from './authorized-persons/authorized-persons.component'; import { LetterGenerateComponent } from './letter-generate/letter-generate.component'; +import { ExceptionLetterGenerateComponent } from './exception-letter-generate/exception-letter-generate.component'; const routes: Routes = [ @@ -31,6 +32,7 @@ const routes: Routes = [ {path: 'letter-generate', component: LetterGenerateComponent, canActivate: [AuthGuard]}, {path: 'workflow-delegation-by-employee', component: WorkflowDelegationByEmployeeComponent, 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-approval', component: LetterRequestApprovalComponent, canActivate: [AuthGuard]}, //{path: 'letter-print-by-admin-panel', component: LetterPrintByAdminPanelComponent, canActivate: [AuthGuard]}, diff --git a/HRM.UI/ClientApp/src/app/adhoc-feature/adhoc-feature.module.ts b/HRM.UI/ClientApp/src/app/adhoc-feature/adhoc-feature.module.ts index e5e9843..88055b1 100644 --- a/HRM.UI/ClientApp/src/app/adhoc-feature/adhoc-feature.module.ts +++ b/HRM.UI/ClientApp/src/app/adhoc-feature/adhoc-feature.module.ts @@ -49,13 +49,14 @@ import { ApproveFinancialDataComponent } from './approve-financial-data/approve- import { AuthorizedPersonsComponent } from './authorized-persons/authorized-persons.component'; import { AuthorizedPersonComponent } from './authorized-persons/authorized-person/authorized-person.component'; import { LetterGenerateComponent } from './letter-generate/letter-generate.component'; +import { ExceptionLetterGenerateComponent } from './exception-letter-generate/exception-letter-generate.component'; @NgModule({ declarations: [workflowRuleComponent, WorkFlowSetupComponent, WorkFlowSetupNewComponent, WorkFlowAdministrativeStatusComponent, WorkFlowAdminComponent, WorkflowDelegationByEmployeeComponent, DelegationFromAdminPanelComponent, LetterRequestApprovalComponent, LetterPrintByAdminPanelComponent, - LetterRequestByAdminApprovalComponent, ApproveFinancialDataComponent, AuthorizedPersonsComponent, AuthorizedPersonComponent, LetterGenerateComponent + LetterRequestByAdminApprovalComponent, ApproveFinancialDataComponent, AuthorizedPersonsComponent, AuthorizedPersonComponent, LetterGenerateComponent, ExceptionLetterGenerateComponent ], imports: [ diff --git a/HRM.UI/ClientApp/src/app/adhoc-feature/exception-letter-generate/exception-letter-generate.component.html b/HRM.UI/ClientApp/src/app/adhoc-feature/exception-letter-generate/exception-letter-generate.component.html new file mode 100644 index 0000000..abff192 --- /dev/null +++ b/HRM.UI/ClientApp/src/app/adhoc-feature/exception-letter-generate/exception-letter-generate.component.html @@ -0,0 +1,58 @@ + +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ + + + + + + + + + + + + + +
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/HRM.UI/ClientApp/src/app/adhoc-feature/exception-letter-generate/exception-letter-generate.component.scss b/HRM.UI/ClientApp/src/app/adhoc-feature/exception-letter-generate/exception-letter-generate.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/HRM.UI/ClientApp/src/app/adhoc-feature/exception-letter-generate/exception-letter-generate.component.ts b/HRM.UI/ClientApp/src/app/adhoc-feature/exception-letter-generate/exception-letter-generate.component.ts new file mode 100644 index 0000000..4812a15 --- /dev/null +++ b/HRM.UI/ClientApp/src/app/adhoc-feature/exception-letter-generate/exception-letter-generate.component.ts @@ -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 +} diff --git a/HRM.UI/ClientApp/src/app/adhoc-feature/letter-generate/letter-generate.component.html b/HRM.UI/ClientApp/src/app/adhoc-feature/letter-generate/letter-generate.component.html index 1d48442..bf85a57 100644 --- a/HRM.UI/ClientApp/src/app/adhoc-feature/letter-generate/letter-generate.component.html +++ b/HRM.UI/ClientApp/src/app/adhoc-feature/letter-generate/letter-generate.component.html @@ -55,6 +55,7 @@
+
diff --git a/HRM.UI/ClientApp/src/app/adhoc-feature/letter-generate/letter-generate.component.ts b/HRM.UI/ClientApp/src/app/adhoc-feature/letter-generate/letter-generate.component.ts index bbed72a..cabdf45 100644 --- a/HRM.UI/ClientApp/src/app/adhoc-feature/letter-generate/letter-generate.component.ts +++ b/HRM.UI/ClientApp/src/app/adhoc-feature/letter-generate/letter-generate.component.ts @@ -60,6 +60,7 @@ export class LetterGenerateComponent implements OnInit { }; } this.showPopUp = true; + this.loadingPanelService.ShowLoadingPanel = true; this.reportService.getAppointmentLetter(data).subscribe( (resp: any) => { if (this.reportType === 'PDF'){ diff --git a/HRM.UI/ClientApp/src/app/app.api.service.ts b/HRM.UI/ClientApp/src/app/app.api.service.ts index 34679f7..e0d0086 100644 --- a/HRM.UI/ClientApp/src/app/app.api.service.ts +++ b/HRM.UI/ClientApp/src/app/app.api.service.ts @@ -13,7 +13,7 @@ export class ApiService { public isSSO = false; public versionDeployement = false; - public versionNumber = `V-${GlobalfunctionExtension.generateVersionNumber(new Date(2025, 0, 16))}-`+"01"; + public versionNumber = `V-${GlobalfunctionExtension.generateVersionNumber(new Date(2025, 1, 25))}-`+"01"; public static BASE_URL = ''; public base_url = ''; // public currentLink = ''; diff --git a/HRM.UI/ClientApp/src/app/attendance/echotex-roster-assignment/echotex-roster-assignment.component.html b/HRM.UI/ClientApp/src/app/attendance/echotex-roster-assignment/echotex-roster-assignment.component.html index ec22198..460a2de 100644 --- a/HRM.UI/ClientApp/src/app/attendance/echotex-roster-assignment/echotex-roster-assignment.component.html +++ b/HRM.UI/ClientApp/src/app/attendance/echotex-roster-assignment/echotex-roster-assignment.component.html @@ -11,13 +11,25 @@
+
+ + + +
+
+ + +
- diff --git a/HRM.UI/ClientApp/src/app/attendance/echotex-roster-assignment/echotex-roster-assignment.component.ts b/HRM.UI/ClientApp/src/app/attendance/echotex-roster-assignment/echotex-roster-assignment.component.ts index 63d58b4..094b4d8 100644 --- a/HRM.UI/ClientApp/src/app/attendance/echotex-roster-assignment/echotex-roster-assignment.component.ts +++ b/HRM.UI/ClientApp/src/app/attendance/echotex-roster-assignment/echotex-roster-assignment.component.ts @@ -31,16 +31,23 @@ export class EchotexRosterAssignmentComponent implements OnInit { workPlanGroupName = ''; workPlanGroupInitialShift = ''; workPlanGroupList: WorkPlanGroup[]; + workPlanGroupListByType: WorkPlanGroup[] = []; selectedEmployees: SearchEmployee[]; employees: Employee[]; empIds: number[] = []; exportExcelFileName: string = ''; + selectedWorkPlanTypeIsFixed: boolean; selectedWorkPlanID: number; fixedWorkPlan: boolean = true; startDate: Date; holidayDayOfWeekArray = Object.values(HolidayDayOfWeek); + workPlanTypes: { text: string, value: boolean| null }[] = [ + { text: 'Fixed', value: true }, + { text: 'Counter Clock', value: false } + ] + constructor(public employeeService: EmployeeServices, public attendanceServices: AttendanceServices, public apiService: ApiService, @@ -85,6 +92,7 @@ export class EchotexRosterAssignmentComponent implements OnInit { createForm() { this.rosterAssignmentForm = new FormBuilder().group({ + type: ['', Validators.required], group: ['', Validators.required], startDate: [''], }); @@ -202,13 +210,13 @@ export class EchotexRosterAssignmentComponent implements OnInit { this.loadingPanel.ShowLoadingPanel = true; this.empWorkPlanSetupList = []; debugger; - if (workPlanGroup.type != EnumWorkPlanGroup.Fixed && - (workPlanGroup.type != undefined || workPlanGroup.type != null)) { - this.fixedWorkPlan = false; - this.startDate = new Date(); - } else { - this.fixedWorkPlan = true; - } + // if (workPlanGroup.type != EnumWorkPlanGroup.Fixed && + // (workPlanGroup.type != undefined || workPlanGroup.type != null)) { + // this.fixedWorkPlan = false; + // this.startDate = new Date(); + // } else { + // this.fixedWorkPlan = true; + // } this.attendanceServices.getEmployeeWorkPlanSetupByWPGroupID(workPlanGroup.id).subscribe( (resp) => { this.empWorkPlanSetupList = resp; @@ -331,7 +339,7 @@ export class EchotexRosterAssignmentComponent implements OnInit { ); } - public getHolidayDayOfWeek( day: number): string { + public getHolidayDayOfWeek(day: number): string { debugger; day = day + 1; switch (day) { @@ -365,4 +373,23 @@ export class EchotexRosterAssignmentComponent implements OnInit { // 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(); + } + } + } diff --git a/HRM.UI/ClientApp/src/app/core-hr/employee-profile/academic/academic-entry/academic-entry.component.html b/HRM.UI/ClientApp/src/app/core-hr/employee-profile/academic/academic-entry/academic-entry.component.html index 725fda2..678fbf5 100644 --- a/HRM.UI/ClientApp/src/app/core-hr/employee-profile/academic/academic-entry/academic-entry.component.html +++ b/HRM.UI/ClientApp/src/app/core-hr/employee-profile/academic/academic-entry/academic-entry.component.html @@ -10,9 +10,10 @@
+
@@ -23,9 +24,10 @@ +
@@ -36,10 +38,10 @@ + @@ -50,10 +52,10 @@ + @@ -94,19 +96,23 @@ -
+
+
-
+
+
-
+
+
-
+
+
diff --git a/HRM.UI/ClientApp/src/app/core-hr/employee-profile/academic/academic-entry/academic-entry.component.ts b/HRM.UI/ClientApp/src/app/core-hr/employee-profile/academic/academic-entry/academic-entry.component.ts index 33c3221..9e16c82 100644 --- a/HRM.UI/ClientApp/src/app/core-hr/employee-profile/academic/academic-entry/academic-entry.component.ts +++ b/HRM.UI/ClientApp/src/app/core-hr/employee-profile/academic/academic-entry/academic-entry.component.ts @@ -17,6 +17,7 @@ import { BasicService } from '../../../../_services/Basic/basic.service'; import { enumEmpFileUploadType, EnumStatus } from '../../../../_models/enums'; import { loadingPanelService } from '../../../../hrm-loding panel/loding.panel.service'; import { empFileuploads } from '../../../../_models/HREmployee/hrEmployee'; +import { forkJoin } from 'rxjs'; @Component({ selector: 'app-academic-entry', @@ -115,84 +116,139 @@ export class AcademicEntryComponent implements OnInit { // } // } loadData() { - this.basicService.getAllEducationLevel().subscribe( - (resp) => { - this.alleducationLevels = resp; + // this.basicService.getAllEducationLevel().subscribe( + // (resp) => { + // this.alleducationLevels = resp; + // }, + // (err: any) => { + // console.log(err); + // }, + // () => { + // // if (this.academic.id > 0) { + // // this.educationLevels = this.alleducationLevels//.filter(x => x.educationTypeID == this.academic.educationTypeID); + // // } + // // else { + // this.educationLevels = this.alleducationLevels//.filter(x => x.educationTypeID == this.academic.educationTypeID); + // // } + // this.basicService.getAllDiscipline().subscribe( + // (resp) => { + // this.alleducationDiscipline = resp; + // }, + // (err: any) => { + // console.log(err); + // }, + // () => { + // // if (this.academic.id > 0) { + // // // this.educationDiscipline = this.alleducationDiscipline.filter(x => x.educationLevelID == this.academic.educationLevelID); + // // // this.educationDiscipline = this.alleducationDiscipline.filter(x => x.id == this.academic.disciplineID); + // // this.educationDiscipline = this.alleducationDiscipline; + // // } + // // else { + // // this.educationDiscipline = this.alleducationDiscipline.filter(x => x.educationLevelID == this.academic.educationLevelID); + // this.educationDiscipline = this.alleducationDiscipline; + // // } + + + // this.basicService.getAllInstitutions().subscribe( + // (resp) => { + // this.allinstitutions = resp; + // }, + // (err: any) => { + // console.log(err); + // }, + // () => { + // if (this.academic.id > 0) { + // // this.institutions = this.allinstitutions.filter(x => x.boardRequired == this.academic.educationType.boardRequired); + // if (this.academic.institution != undefined && this.academic.institution.boardRequired) + // // this.institutions = this.allinstitutions.filter(x => x.id == this.academic.institutionID || x.boardRequired == true); + // this.institutions = this.allinstitutions.filter(x => x.boardRequired == true); + // else + // // this.institutions = this.allinstitutions.filter(x => x.educationTypeID == this.academic.educationTypeID); + // this.institutions = this.allinstitutions.filter(x => x.boardRequired == false); + // } + // //console.log(this.institutions); + + // this.basicService.getAllResultTypesByStatus(EnumStatus.Regardless).subscribe( + // (resp) => { + // this.allresultTypes = resp; + // }, + // (err: any) => { + // console.log(err); + // }, + // () => { + // if (this.academic.id > 0) + // //console.log(this.allresultTypes); + // if (this.academic.id > 0) { + // let selectedEducationType: EducationType[] = this.educationTypes//.filter(x => x.id == this.academic.educationTypeID) + // // this.resultTypes = this.allresultTypes.filter(x => x.type == selectedEducationType[0].resultType); + // // if (selectedEducationType[0].resultType === 2 || selectedEducationType[0].resultType === 4) { + // // this.isGrade = true; + // // } + // // else { + // // 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); + // let descp = this.alleducationDiscipline.find(d => d.description.toLowerCase() == 'nil'); + // this.academic.disciplineID = descp != undefined ? descp.id : 0; + // let inst = this.allinstitutions.find(d => d.name.toLowerCase() == 'Institute of Chartered Secretary of Bangladesh'.toLowerCase()); + // this.academic.institutionID = inst != undefined ? inst.id : 0; + // } + // } + // ); + // } + // ); + // } + // ); + // } + // ); + const educationlevelService = this.basicService.getAllEducationLevel(); + const disciplineService = this.basicService.getAllDiscipline(); + const institutionService = this.basicService.getAllInstitutions(); + const resultTyoeService = this.basicService.getAllResultTypesByStatus(EnumStatus.Regardless); + + this.loadingPanelService.ShowLoadingPanel = true; + forkJoin(educationlevelService, disciplineService, institutionService, resultTyoeService).subscribe( + ([res1, res2, res3, res4]) => { + this.alleducationLevels = res1; + this.alleducationDiscipline = res2; + this.allinstitutions = res3; + this.allresultTypes = res4; }, - (err: any) => { - console.log(err); + (x) => { + this.loadingPanelService.ShowLoadingPanel = false; + console.log(x); + this.notificationService.showError(x.error); }, () => { - if (this.academic.id > 0) { - this.educationLevels = this.alleducationLevels.filter(x => x.educationTypeID == this.academic.educationTypeID); + this.educationLevels = this.alleducationLevels; + this.educationDiscipline = this.alleducationDiscipline; + this.institutions = this.allinstitutions; + this.resultTypes = this.allresultTypes; + + this.loadingPanelService.ShowLoadingPanel = 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; + let descp = this.alleducationDiscipline.find(d => d.description.toLowerCase() == 'nil'); + this.academic.disciplineID = descp != undefined ? descp.id : 0; + this.selectedDisciplineID = this.academic.disciplineID; + let inst = this.allinstitutions.find(d => d.name.toLowerCase() == 'Institute of Chartered Secretary of Bangladesh'.toLowerCase()); + this.academic.institutionID = inst != undefined ? inst.id : 0; + this. selectedInstitutionID = this.academic.institutionID; + this.academic.examDate = new Date().getFullYear(); + this.academic.passingYear = new Date().getFullYear(); + // this.selectEducationTypeEvent(educationType.id); } - else { - this.educationLevels = this.alleducationLevels.filter(x => x.educationTypeID == this.academic.educationTypeID); - } - this.basicService.getAllDiscipline().subscribe( - (resp) => { - this.alleducationDiscipline = resp; - }, - (err: any) => { - console.log(err); - }, - () => { - if (this.academic.id > 0) { - // this.educationDiscipline = this.alleducationDiscipline.filter(x => x.educationLevelID == this.academic.educationLevelID); - // this.educationDiscipline = this.alleducationDiscipline.filter(x => x.id == this.academic.disciplineID); - this.educationDiscipline = this.alleducationDiscipline; - } - else { - // this.educationDiscipline = this.alleducationDiscipline.filter(x => x.educationLevelID == this.academic.educationLevelID); - this.educationDiscipline = this.alleducationDiscipline; - } - - - this.basicService.getAllInstitutions().subscribe( - (resp) => { - this.allinstitutions = resp; - }, - (err: any) => { - console.log(err); - }, - () => { - if (this.academic.id > 0) { - // this.institutions = this.allinstitutions.filter(x => x.boardRequired == this.academic.educationType.boardRequired); - if (this.academic.institution.boardRequired) - // this.institutions = this.allinstitutions.filter(x => x.id == this.academic.institutionID || x.boardRequired == true); - this.institutions = this.allinstitutions.filter(x => x.boardRequired == true); - else - // this.institutions = this.allinstitutions.filter(x => x.educationTypeID == this.academic.educationTypeID); - this.institutions = this.allinstitutions.filter(x => x.boardRequired == false); - } - //console.log(this.institutions); - - this.basicService.getAllResultTypesByStatus(EnumStatus.Regardless).subscribe( - (resp) => { - this.allresultTypes = resp; - }, - (err: any) => { - console.log(err); - }, - () => { - if (this.academic.id > 0) - //console.log(this.allresultTypes); - if (this.academic.id > 0) { - let selectedEducationType: EducationType[] = this.educationTypes.filter(x => x.id == this.academic.educationTypeID) - // this.resultTypes = this.allresultTypes.filter(x => x.type == selectedEducationType[0].resultType); - // if (selectedEducationType[0].resultType === 2 || selectedEducationType[0].resultType === 4) { - // this.isGrade = true; - // } - // else { - // this.isGrade = false; - // } - } - } - ); - } - ); - } - ); } ); } @@ -210,8 +266,8 @@ export class AcademicEntryComponent implements OnInit { } selectEducationTypeEvent(typeid: number) { if (typeid !== null) { - this.educationLevels = this.alleducationLevels.filter(x => x.educationTypeID == typeid); - let selectedEducationType: EducationType[] = this.educationTypes.filter(x => x.id == this.academic.educationTypeID) + this.educationLevels = this.alleducationLevels//.filter(x => x.educationTypeID == typeid); + let selectedEducationType: EducationType[] = this.educationTypes//.filter(x => x.id == this.academic.educationTypeID) // this.institutions = this.allinstitutions.filter(x => x.boardRequired == selectedEducationType[0].boardRequired); // this.institutions = this.allinstitutions.filter(x => x.educationTypeID == typeid); this.institutions = this.allinstitutions; @@ -250,7 +306,7 @@ export class AcademicEntryComponent implements OnInit { if (seletedInstitution.boardRequired == true) resultType = 1; else resultType = 2; if (institutionid !== null) - this.resultTypes = this.allresultTypes.filter(x => x.type == resultType); + this.resultTypes = this.allresultTypes//.filter(x => x.type == resultType); this.selectedResultTypeID = null; this.isGrade = false; @@ -285,7 +341,7 @@ export class AcademicEntryComponent implements OnInit { educationLevelPicker: ['', Validators.required], disciplinePicker: ['', Validators.required], institutionPicker: ['', Validators.required], - resultTypePicker: ['', Validators.required], + resultTypePicker: [''], examHeldOn: ['', Validators.required], passingYear: ['', Validators.required], gpaOrMarks: [''], @@ -304,11 +360,12 @@ export class AcademicEntryComponent implements OnInit { this.selectedResultTypeID = this.academic.resultTypeID; } public onSave(e): void { + debugger; this.academic.educationTypeID = this.selectedEducationTypeID; this.academic.educationLevelID = this.selectedEducationLevelID; this.academic.institutionID = this.selectedInstitutionID; 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) { this.notificationService.showWarning('please select an employee'); this.onCancel(null); @@ -320,10 +377,9 @@ export class AcademicEntryComponent implements OnInit { return; } - this.academic.createdBy = 0; this.academic.employeeID = this.employeeService.hrEmployee.id; - this.academic.createdDate = new Date(this.academic.createdBy); this.academic.createdBy = 0; + this.academic.createdDate = new Date(); this.loadingPanelService.ShowLoadingPanel = true; this.employeeService.saveEmployeeAcademic(this.academic).subscribe( (resp) => { diff --git a/HRM.UI/ClientApp/src/app/core-hr/employee-profile/contact/contact.component.html b/HRM.UI/ClientApp/src/app/core-hr/employee-profile/contact/contact.component.html index 370a8ef..9bbd7ea 100644 --- a/HRM.UI/ClientApp/src/app/core-hr/employee-profile/contact/contact.component.html +++ b/HRM.UI/ClientApp/src/app/core-hr/employee-profile/contact/contact.component.html @@ -57,6 +57,21 @@ [(ngModel)]="contact.permanentTelephone" type="text" pInputText style="width:100%">
+
+ +
+
+ +
+ +
+ +
+
+ +
@@ -65,21 +80,15 @@ [(ngModel)]="contact.parmanentPOInBangla" type="text" pInputText style="width:100%">
+
- -
-
- -
-
-
+
+ [(ngModel)]="employee.emailAddress" formControlName="emailAddress" pInputText>
diff --git a/HRM.UI/ClientApp/src/app/payroll/career-and-profile/employee-payroll-profile/employee-payroll-profile.component.ts b/HRM.UI/ClientApp/src/app/payroll/career-and-profile/employee-payroll-profile/employee-payroll-profile.component.ts index 1505470..65f6fbf 100644 --- a/HRM.UI/ClientApp/src/app/payroll/career-and-profile/employee-payroll-profile/employee-payroll-profile.component.ts +++ b/HRM.UI/ClientApp/src/app/payroll/career-and-profile/employee-payroll-profile/employee-payroll-profile.component.ts @@ -137,6 +137,8 @@ export class EmployeePayrollProfileComponent implements OnInit { this.lastSalaryProcessDate(); + this.selectedCategoryid = this.ddlcategories.find(x => x.name.toLowerCase() == "worker").id; + // this.loadingPanelService.ShowLoadingPanel = true; // this.employeeService.generateEmployeeNo().subscribe( // (resp) => { @@ -153,6 +155,7 @@ export class EmployeePayrollProfileComponent implements OnInit { } else { this.employee.employeeNo = undefined; + this.selectedCategoryid = undefined; } } @@ -416,7 +419,7 @@ export class EmployeePayrollProfileComponent implements OnInit { this.selectedEmployee.categoryID = this.employee.categoryID; this.selectedEmployee.name = this.employee.name; this.selectedEmployee.employeeNo = this.employee.employeeNo; - this.showBankAccount = true; + // this.showBankAccount = true; } else { this.employee = new Employee(); diff --git a/HRM.UI/ClientApp/src/app/payroll/career-and-profile/life-cycle-entry/life-cycle-entry.component.ts b/HRM.UI/ClientApp/src/app/payroll/career-and-profile/life-cycle-entry/life-cycle-entry.component.ts index a160953..6e6ea7e 100644 --- a/HRM.UI/ClientApp/src/app/payroll/career-and-profile/life-cycle-entry/life-cycle-entry.component.ts +++ b/HRM.UI/ClientApp/src/app/payroll/career-and-profile/life-cycle-entry/life-cycle-entry.component.ts @@ -30,6 +30,7 @@ import { PayrollType } from '../../../_models/Authentication/payrollType'; import { GrievanceManagementService } from '../../../_services/grievance-management/grievanceManagement.service'; import { ActivatedRoute, Router } from '@angular/router'; import { WorkflowService } from '../../../_services/workflow/workflow.service'; +import { AuthService } from '../../../_services/auth/auth.service'; @Component({ @@ -77,6 +78,8 @@ export class LifeCycleEntryComponent implements OnInit { this.empPickerActive = false; } _effectDate: Date = undefined; + public payrollType: PayrollType = undefined; + public salaryMonth: Date = new Date(); public empPickerActive: boolean = true; public isDesingation: boolean = false; public isDepartment: boolean = false; @@ -104,6 +107,7 @@ export class LifeCycleEntryComponent implements OnInit { public utilityHandlerService: UntilityHandlerService, public organogramService: OrganogramService, public loadingPanelService: loadingPanelService, public router: Router, public workflowService: WorkflowService, + public authservice: AuthService, public acrouter: ActivatedRoute,) { if (this.router.url === '/payroll/career-and-profile/life-cycle-entry') 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() { @@ -173,7 +186,7 @@ export class LifeCycleEntryComponent implements OnInit { } EventselectionChange(value: any) { - + debugger; this.isDesingation = false; this.isDepartment = false; this.isCategory = false; @@ -292,6 +305,16 @@ export class LifeCycleEntryComponent implements OnInit { }); 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); + } } } diff --git a/HRM.UI/Controllers/LetterRequest/LetterRequestController.cs b/HRM.UI/Controllers/LetterRequest/LetterRequestController.cs index e529a78..d39409e 100644 --- a/HRM.UI/Controllers/LetterRequest/LetterRequestController.cs +++ b/HRM.UI/Controllers/LetterRequest/LetterRequestController.cs @@ -11,11 +11,13 @@ using AutoMapper.Configuration; using Google.Protobuf.WellKnownTypes; using HRM.BO; using HRM.DA; +using HRM.Report; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.StaticFiles; using Microsoft.Extensions.Configuration; +using NPOI.HPSF; using NPOI.SS.Formula.Functions; using Org.BouncyCastle.Ocsp; using static HRM.Report.PayrollDataSet.PayrollDataSet; @@ -783,6 +785,88 @@ namespace HRM.UI.Controllers } + [HttpPost("generatedExceptiinLetter/{letterType}")] + public ActionResult generatedExceptiinLetter(int letterType, List 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 sFilePaths = new List(); + List> filesWithContents = new List>(); + List files = new List(); + + 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(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(); + } } } \ No newline at end of file