esquema da base de dados para a folha de tempo

Alguém pode ajudar-me com um esquema de base de dados para uma aplicação de tempo em que eu seria capaz de

  1. armazenar horas por dia para um período de tempo (2 semanas ) para diferentes projetos. Ex pessoa a pode colocar 3 horas para o projecto e 4 horas para o projectB no mesmo dia

  2. torná-lo de modo que é fácil de obter um relatório sobre o total de horas colocadas para um projeto, ou para obter horas totais em todos os projetos por uma determinada pessoa

editar: outro a exigência seria que cada folha de tempo para um determinado período de tempo para cada pessoa precisa ter um campo indicando que a pessoa apresentou a folha de tempo e outro dizendo que foi aprovado

Author: randomThought, 2010-07-19

5 answers

Empréstimo de Eric Petroelje & mdma:

Employee 
- EmployeeID (PK)
- EmployeeName
- Other_fields

Project
- ProjectID (PK)
- ProjectName
- Other_fields

WorkSegment
- WorkSegmentID (PK)
- ProjectID (IX1)
- EmployeeID (IX2)
- Date (IX1, IX2)
- StartTime 
- EndTime
- PayrollCycleID (FK)

O primeiro índice do sector do trabalho é a data do projecto. O segundo índice do sector do trabalho é o emprego, Data. Estes índices não são únicos. Isto é para que uma pessoa possa trabalhar em um projeto mais de uma vez em um dia. Os índices permitem comunicar as horas de trabalho por projecto ou por pessoa.

Cada linha de trabalho é para um segmento de tempo, um dia, um projecto. Cada empregado tem tantas linhas de trabalho como é necessário para descrever o ciclo de pagamentos dele.
TimeSheetSegment
- TimeSheetSegmentID (PK)
- ProjectId (FK)
- EmployeeId (FK)
- PayrollCycleID (FK)

Existe um índice único sobre o projecto, o emprego e o subsídio de desemprego. Há uma linha de segmentação de tempo para cada projeto para o qual um empregado trabalha durante um ciclo de folha de pagamento.

TimeSheet
- TimeSheetID (PK)
- EmployeeID (IX)
- PayrollCycleID (IX)

A linha TimeSheet reúne as linhas TimeSheetSegment e WorkSegment. O índice EmployeeID, PayrollCycleID é único.

Approval
- TimeSheetID (PK)
- PayrollCycleID (FK)
- SubmittedTimestamp
- ApproverID (FK)
- ApprovedTimestamp

A linha de homologação é criada aquando da apresentação do calendário. Estes campos podem fazer parte da tabela de TimeSheet. Eu quebrei eles para fora com uma normalização de quarta ordem, porque a tabela de aprovação é provável que tenha permissões de acesso de banco de dados diferentes da tabela de TimeSheet.

PayrollCycle
- PayrollCycleID (PK)
- PayrollCycleYear
- PayrollCycleNumber
- StartDate 
- EndDate
- DirectDepositDate
- CheckDate
- Other_fields

A tabela PayrollCycle normaliza alguns dos campos de datas, e fornece uma chave inteira que torna mais fácil reunir as linhas de repartição do trabalho e de repartição do tempo para fazer uma folha de tempo coerente.

 10
Author: Gilbert Le Blanc, 2010-07-19 17:42:10
Aqui está um esboço que lhe dará um bom começo.
Project
-------
ProjectId  PK
ProjectName varchar(200)

Employee
---------
EmployeeId  PK
EmployeeName (or first name/last name etc..)
// .. other employee attributes


ProjectTimesheet
----------------
ProjectTimesheetId PK
ProjectId          FK -> Project.ProjectId
EmployeeId         FK -> Employee.EmployeeId
StartTime          DATETIME
EndTime            DATETIME
Approved           bit

Editar: em alternativa à opção aprovada em cada linha de tempo do projecto, poderá separar o estado aprovado para uma tabela separada. Por exemplo, para permitir a aprovação da folha de tempo de um empregado durante um determinado período, um gestor adicionaria uma entrada de aprovação à tabela de aprovação:

Approval
--------
ApprovalID    PK
EmployeeId    FK -> Employee.EmployeeId
StartTime     DATETIME
EndTime       DATETIME
ApprovedBy    FK -> Employee.EmployeeId (e.g. the manager)
ApprovedDate  timestamp  // date the approval was registered
 2
Author: mdma, 2010-07-19 16:08:35

Uma tabela para as pessoas (1)

Um quadro para projectos (2)

Uma tabela para reservas ( 3) - Quem fez o trabalho (FK em 1), em que projeto eles trabalharam (FK em 2), quando eles fizeram o trabalho, quanto trabalho eles fizeram.

Seleccione a sum (time_book) de (3) onde a pessoa é igual (algum id de 1) e project = (algum ID de 2)

Ou

Seleccione a sum (time_book) de (3) onde a pessoa é igual a (algum id de 1)

Etc...

 0
Author: PaulJWilliams, 2010-07-19 15:25:40
Parece um trabalho de casa, mas provavelmente começaria por algo assim.
People 
  - PersonID (PK)
  - PersonName
  - Other fields

Projects
  - ProjectID (PK)
  - ProjectName
  - Other fields

WorkTime
  - TimeID (PK)
  - ProjectID (FK)
  - PersonID (FK)
  - StartTime
  - EndTime
 0
Author: Eric Petroelje, 2010-07-19 15:26:37

O seguinte código é retirado do ]project-open [ open-source system na sintaxe PostgreSQL e editado.

Por favor note a tabela "conf_objects" com informação de aprovação/confirmação. Quando o usuário "submete" uma folha de tempo, todas as horas enviadas são atribuídas a um novo conf_object. É tarefa do supervisor definir o status do conf_object para "aprovado". Tanto o supervisor como o usuário podem excluir o conf_object a qualquer momento, o que marcará as horas como "não submetido" (hora.conf_object_id = NULL), De modo que estas horas terminarão no relatório" horas não submetidas".

CREATE TABLE projects (
    project_id                      integer constraint projects_pk primary key,
    project_name                    text not null,
    parent_id                       integer constraint projects_parent_fk references projects,
[...]
    project_type_id                 integer not null constraint projects_prj_type_fk references categories,
    project_status_id               integer not null constraint projects_prj_status_fk references categories,
    description                     text,
    start_date                      timestamptz,
    end_date                        timestamptz
);


CREATE TABLE users (
    user_id integer constraint users_pk primary key,
    first_names text,
    last_name text
[...]
);

-- Confirmation (=approval) objects
CREATE TABLE conf_objects (
    conf_id         integer constraint conf_id_pk primary key,
    conf_status_id  integer constraint conf_status_nn not null
);


CREATE TABLE hours (
    user_id                 integer constraint hours_user_id_nn not null constraint hours_user_id_fk references users,
    project_id              integer constraint hours_project_id_nn not null constraint hours_project_id_fk references projects,
    day                     date constraint hours_day_nn not null,
    hours                   numeric(5,2) not null,
[...]
    note                    text,
    conf_object_id          integer constraint hours_conf_object_fk references conf_objects
);

As instruções originais ]po[ SQL estão incluídas na ~/packs/intranet-*/sql/postgresql/intranet-*-create.scripts de criação sql.

 0
Author: fraber, 2013-06-01 10:35:42