feat: time tracking
This commit is contained in:
		@@ -167,11 +167,10 @@ class PayrollService(BaseService):
 | 
			
		||||
        )
 | 
			
		||||
        return response
 | 
			
		||||
 | 
			
		||||
    async def _create_payment_record_hourly(
 | 
			
		||||
    def get_amount(
 | 
			
		||||
            self,
 | 
			
		||||
            creator: User,
 | 
			
		||||
            user: User,
 | 
			
		||||
            record_schema: PaymentRecordCreateSchema
 | 
			
		||||
            work_units: int
 | 
			
		||||
    ):
 | 
			
		||||
        pay_rate: PayRate = user.pay_rate
 | 
			
		||||
        overtime_threshold = 0
 | 
			
		||||
@@ -183,13 +182,22 @@ class PayrollService(BaseService):
 | 
			
		||||
            overtime_rate = pay_rate.overtime_rate
 | 
			
		||||
 | 
			
		||||
        if overtime_threshold == 0 or overtime_rate == 0:
 | 
			
		||||
            base_units = record_schema.work_units
 | 
			
		||||
            base_units = work_units
 | 
			
		||||
            overtime_units = 0
 | 
			
		||||
        else:
 | 
			
		||||
            overtime_units = max(0, record_schema.work_units - overtime_threshold)
 | 
			
		||||
            base_units = record_schema.work_units - overtime_units
 | 
			
		||||
            overtime_units = max(0, work_units - overtime_threshold)
 | 
			
		||||
            base_units = work_units - overtime_units
 | 
			
		||||
 | 
			
		||||
        amount = pay_rate.base_rate * base_units + overtime_rate * overtime_units
 | 
			
		||||
        return pay_rate.base_rate * base_units + overtime_rate * overtime_units
 | 
			
		||||
 | 
			
		||||
    async def _create_payment_record_hourly(
 | 
			
		||||
            self,
 | 
			
		||||
            creator: User,
 | 
			
		||||
            user: User,
 | 
			
		||||
            record_schema: PaymentRecordCreateSchema
 | 
			
		||||
    ):
 | 
			
		||||
        pay_rate: PayRate = user.pay_rate
 | 
			
		||||
        amount = self.get_amount(user, record_schema.work_units)
 | 
			
		||||
        payment_record_dict = record_schema.model_dump()
 | 
			
		||||
        del payment_record_dict['user']
 | 
			
		||||
        payment_record_dict.update({
 | 
			
		||||
@@ -202,54 +210,14 @@ class PayrollService(BaseService):
 | 
			
		||||
        stmt = (
 | 
			
		||||
            insert(
 | 
			
		||||
                PaymentRecord
 | 
			
		||||
            ).values(
 | 
			
		||||
            )
 | 
			
		||||
            .values(
 | 
			
		||||
                **payment_record_dict
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        await self.session.execute(stmt)
 | 
			
		||||
        await self.session.commit()
 | 
			
		||||
 | 
			
		||||
    async def _create_payment_record_daily(
 | 
			
		||||
            self,
 | 
			
		||||
            creator: User,
 | 
			
		||||
            user: User,
 | 
			
		||||
            record_schema: PaymentRecordCreateSchema
 | 
			
		||||
    ):
 | 
			
		||||
        pay_rate: PayRate = user.pay_rate
 | 
			
		||||
        amount = pay_rate.base_rate * record_schema.work_units
 | 
			
		||||
        payment_record_dict = record_schema.model_dump()
 | 
			
		||||
        del payment_record_dict['user']
 | 
			
		||||
 | 
			
		||||
        payment_record_dict.update({
 | 
			
		||||
            'created_by_user_id': creator.id,
 | 
			
		||||
            'created_at': datetime.datetime.now(),
 | 
			
		||||
            'payroll_scheme_key': pay_rate.payroll_scheme.key,
 | 
			
		||||
            'amount': amount,
 | 
			
		||||
            'user_id': record_schema.user.id
 | 
			
		||||
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
    async def _create_payment_record_monthly(
 | 
			
		||||
            self,
 | 
			
		||||
            creator: User,
 | 
			
		||||
 | 
			
		||||
            user: User,
 | 
			
		||||
            record_schema: PaymentRecordCreateSchema
 | 
			
		||||
    ) -> CreatePaymentRecordResponse:
 | 
			
		||||
        pay_rate: PayRate = user.pay_rate
 | 
			
		||||
        amount = pay_rate.base_rate * record_schema.work_units
 | 
			
		||||
        payment_record_dict = record_schema.model_dump()
 | 
			
		||||
        del payment_record_dict['user']
 | 
			
		||||
 | 
			
		||||
        payment_record_dict.update({
 | 
			
		||||
            'created_by_user_id': creator.id,
 | 
			
		||||
            'created_at': datetime.datetime.now(),
 | 
			
		||||
            'payroll_scheme_key': pay_rate.payroll_scheme.key,
 | 
			
		||||
            'amount': amount,
 | 
			
		||||
            'user_id': record_schema.user.id
 | 
			
		||||
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
    async def create_payment_record(
 | 
			
		||||
            self,
 | 
			
		||||
            request: CreatePaymentRecordRequest,
 | 
			
		||||
@@ -282,7 +250,8 @@ class PayrollService(BaseService):
 | 
			
		||||
            stmt = (
 | 
			
		||||
                delete(
 | 
			
		||||
                    PaymentRecord
 | 
			
		||||
                ).where(
 | 
			
		||||
                )
 | 
			
		||||
                .where(
 | 
			
		||||
                    PaymentRecord.id == request.payment_record_id
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user