SPECManager API Connector#

Use the specmanagerapi connector to interact with SPECManager API.

This connector assumes that it has SPECManager v5 installed with the SPECManager-API LIPS package.

Import module#

from spec_utils import SMAPIClient, SMEmployeeType
from spec_utils._schemas import specmanager as smschema

Client settings#

URL = '<your-nettime-url>'
APIKEY = '<your-api-key>'

Start session manually#

client = SMAPIClient(url=URL, apikey=APIKEY)
client.start_session()

client.is_connected
See out...
True

Close session manually#

client.close_session()

client.is_connected
See out...
False

Get clockings#

import datetime as dt

with SMAPIClient(url=URL, apikey=APIKEY) as client:
    clockings = client.get_clockings(
        type_=SMEmployeeType.CONTRACTOR,
        from_="20210101083000", #%Y%m%d%H%M%S
        to_=dt.datetime.now(),  # current time
    )

# check result
clockings
See out...
{'ok': True,
 'error': None,
 'response': {'count': 320,
  'pages': 16,
  'clockings': [{'id': 72493,
    'employee': 774,
    'type': 71,
    'card': '12345678',
    'tmp': '20210808103422',
    'result': 66,
    'offline': 0,
    'gl': 34,
    'reader': 66,
    'aux': '0000',
    'value': 0,
    'terminal': 23,
# show more (open the raw output data in a text editor) ...

    'gl': 18,
    'reader': 66,
    'aux': '0000',
    'value': 0,
    'terminal': 11,
    'version': 0}]}}

Including history table#

import datetime as dt

with SMAPIClient(url=URL, apikey=APIKEY) as client:
    clockings = client.get_clockings(
        type_=SMEmployeeType.CONTRACTOR,
        from_="20210101083000", #%Y%m%d%H%M%S
        to_=dt.datetime.now(),  # current time
        fromHistory=True
    )

# check result
clockings
See out...
{'ok': True,
 'error': None,
 'response': {'count': 10320,
  'pages': 516,
  'clockings': [{'id': 61493,
    'employee': 774,
    'type': 71,
    'card': '12345678',
    'tmp': '20210101113215',
    'result': 66,
    'offline': 0,
    'gl': 34,
    'reader': 66,
    'aux': '0000',
    'value': 0,
    'terminal': 23,
# show more (open the raw output data in a text editor) ...

    'gl': 18,
    'reader': 66,
    'aux': '0000',
    'value': 0,
    'terminal': 11,
    'version': 0}]}}

Including Employee detail#

import datetime as dt

with SMAPIClient(url=URL, apikey=APIKEY) as client:
    clockings = client.get_clockings(
        type_=SMEmployeeType.CONTRACTOR,
        from_="20210101083000", #%Y%m%d%H%M%S
        to_=dt.datetime.now(),  # current time
        employeeDetail=True
    )

# check result
clockings
See out...
{'ok': True,
 'error': None,
 'response': {'count': 320,
  'pages': 16,
  'clockings': [{'id': 72493,
    'employee': {'code': 774,
     'mat': '774',
     'card': '12345678',
     'centerCode': 'AR',
     'centerDesc': 'DEMO',
     'firstname': 'John',
     'lastName': 'Dow',
     'dni': '87654321',
     'company': '',
     'optionalData': []},
    'type': 71,
    'card': '12345678',
    'tmp': '20210808103422',
    'result': 66,
    'offline': 0,
    'gl': 34,
    'reader': 66,
    'aux': '0000',
    'value': 0,
    'terminal': 23,
# show more (open the raw output data in a text editor) ...

    'gl': 18,
    'reader': 66,
    'aux': '0000',
    'value': 0,
    'terminal': 11,
    'version': 0}]}}

Including optionals data#

import datetime as dt

with SMAPIClient(url=URL, apikey=APIKEY) as client:
    clockings = client.get_clockings(
        type_=SMEmployeeType.CONTRACTOR,
        from_="20210101083000", #%Y%m%d%H%M%S
        to_=dt.datetime.now(),  # current time
        employeeDetail=True,
        employeeData=[1, 2]
    )

# check result
clockings
See out...
{'ok': True,
 'error': None,
 'response': {'count': 320,
  'pages': 16,
  'clockings': [{'id': 72493,
    'employee': {'code': 774,
     'mat': '774',
     'card': '12345678',
     'centerCode': 'AR',
     'centerDesc': 'DEMO',
     'firstname': 'John',
     'lastName': 'Dow',
     'dni': '87654321',
     'company': '',
     'optionalData': [{
       '1': 'some-value',
       '2': 'another-value'}]},
    'type': 71,
    'card': '12345678',
    'tmp': '20210808103422',
    'result': 66,
    'offline': 0,
    'gl': 34,
    'reader': 66,
    'aux': '0000',
    'value': 0,
    'terminal': 23,
# show more (open the raw output data in a text editor) ...

    'gl': 18,
    'reader': 66,
    'aux': '0000',
    'value': 0,
    'terminal': 11,
    'version': 0}]}}

Save employee#

To import or update employees you can use the methods post_employee and post_employees, depending on whether you want to send one or more of them.

To set the data of an employee, you can use the schemes included in spec_utils._schemas.specmanager, use native types or combine between them and spec_utils will understand your data :sunglasses:.

Using native types#


employee_data = {
    "code": 50505,
    "nif": "50505",
    "enmrollment":"50505",
    "optionalData": [{
        "level": 8,
        "value": "20123456789"
    }],
    "lastName":"Doe",
    "firstName":"John",
    "center": {
        "code": "AR"
    },
    "isActive": True,
    "comment": "- new entry comment",
    "cardList": {
        "cards": [{"number": "808080"}, {"number": "909090"}],
        "required": True
    },
    "department": {
        "path": "SPEC/AR/DEMO"
    }
}

with SMAPIClient(url=URL, apikey=APIKEY) as client:
    response = client.post_employee(
        type_=SMEmployeeType.OWN,
        employee=employee_data
    )
See out...
{'ok': True, 'error': None, 'response': 'Datos importados correctamente.'}

Using schemes#

from spec_utils._schemas import specmanager as smschema

employee_data = smschema.Employee(
    code=50505,
    nif=50505,
    enrollment=50505,
    optionalData=[smschema.OptionalData(
        level=1,
        value="20123456789"
    )],
    lastName="Doe",
    firstName="John",
    center=smschema.Center(
        code='AR'
    ),
    isActive=True,
    comment="- new entry comment",
    cardList=smschema.CardList(
        cards=[smschema.Card(
            number="808080"
        )],
        required=True
    ),
    department=smschema.Department(
        path="SPEC/AR/DEMO"
    ),
)

with SMAPIClient(url=URL, apikey=APIKEY) as client:
    response = client.post_employee(
        type_=SMEmployeeType.OWN,
        employee=employee_data
    )
See out...
{'ok': True, 'error': None, 'response': 'Datos importados correctamente.'}

Combining types#

from spec_utils._schemas import specmanager as smschema

employee_data = smschema.Employee(
    code=50505,
    nif=50505,
    enrollment=50505,
    optionalData=[{
        "level": 8,
        "value": "20123456789"
    }],
    lastName="Doe",
    firstName="John",
    center={
        "code": "AR"
    },
    isActive=True,
    comment="- new entry comment",
    cardList={
        "cards": [{"number": "808080"}, {"number": "909090"}],
        "required": True
    },
    department=smschema.Department(
        path="SPEC/AR/DEMO"
    ),
)

with SMAPIClient(url=URL, apikey=APIKEY) as client:
    response = client.post_employee(
        type_=SMEmployeeType.OWN,
        employee=employee_data
    )
See out...
{'ok': True, 'error': None, 'response': 'Datos importados correctamente.'}

* You can review the schemes to inspect the data and create more variants.