Exemplo n.º 1
0
    def test_create_and_update_audit_config(self):
        positions = [
            {'name': '总裁', 'code': 'ceo'},
            {'name': '负责人', 'code': 'owner'},
            {'name': '会计', 'code': 'accountant'},
            {'name': '出纳', 'code': 'cashier'},
            {'name': '组员', 'code': 'member'},  # 各部门一般成员职位
            {'name': '业务经理', 'code': 'mgr'}  # 只在大宗商品事业部
        ]
        for pos in positions:
            Position.objects.create(**pos)

        departments = [
            {'name': '总部', 'code': 'root'},
            {'name': '大宗商品事业部', 'code': 'dazong'},
            {'name': '财务中心', 'code': 'fin'},
            {'name': '人力行政中心', 'code': 'hr'},
        ]
        for dep in departments:
            Department.objects.create(**dep)

        specs.createAuditConfig(spec='fin.cost_lte_5000:\
                                fin.accountant->\
                                _.owner->\
                                hr.owner->\
                                fin.owner->\
                                fin.cashier')

        config = AuditActivityConfig.objects.all()[0]
        self.assertEqual(config.category, 'fin')
        self.assertEqual(config.subtype, 'cost_lte_5000')
        steps = AuditActivityConfigStep.objects.filter(
            config=config).order_by('position')
        self.assertEqual(steps.count(), 5)
        stepDeps = [
            s.assigneeDepartment.code if s.assigneeDepartment else None for s in steps]
        stepPos = [
            s.assigneePosition.code if s.assigneePosition else None for s in steps]
        self.assertListEqual(stepDeps, ['fin', None, 'hr', 'fin', 'fin'])
        self.assertListEqual(
            stepPos, ['accountant', 'owner', 'owner', 'owner', 'cashier'])

        specs.updateAuditConfig(spec='fin.cost_lte_5000:fin.accountant->_.owner->hr.owner')
        config = AuditActivityConfig.objects.first()
        self.assertEqual(config.category, 'fin')
        self.assertEqual(config.subtype, 'cost_lte_5000')
        steps = AuditActivityConfigStep.objects.filter(
            config=config).order_by('position')
        self.assertEqual(steps.count(), 3)
        stepDeps = [
            s.assigneeDepartment.code if s.assigneeDepartment else None for s in steps]
        stepPos = [
            s.assigneePosition.code if s.assigneePosition else None for s in steps]
        self.assertListEqual(stepDeps, ['fin', None, 'hr'])
        self.assertListEqual(
            stepPos, ['accountant', 'owner', 'owner'])
Exemplo n.º 2
0
def add_rongzi_audit(apps, schema_editor):
    pos_owner = Position.objects.filter(code='owner').first()
    if pos_owner is None:
        # prepare data
        cmd = prepareData.Command()
        cmd.handle()
        pos_owner = Position.objects.get(code='owner')

    dep = Department.objects.filter(code='jinrong').first()
    if dep is None:
        dep = Department.objects.create(code='jinrong', name='金融中心负责人')
        DepPos.objects.create(pos=pos_owner, dep=dep)

    specs.createAuditConfig(spec='law.rongzitikuan:\
                            jinrong.owner->\
                            fin.fin_accountant->\
                            fin.owner->\
                            root.ceo...')
def add_audit_flow(apps, schema_editor):
    specs.createAuditConfig(spec='law.biz_contract_no_risk:\
                            fin.fin_accountant->\
                            dazong.owner->\
                            fin.owner...')

    specs.createAuditConfig(spec='law.biz_contract_risk:\
                            fin.fin_accountant->\
                            dazong.owner->\
                            fin.owner->\
                            root.ceo...')

    specs.createAuditConfig(spec='fin.money_no_risk:\
                            fin.fin_accountant->\
                            dazong.owner->\
                            fin.owner...')

    specs.createAuditConfig(spec='fin.money_risk:\
                            fin.fin_accountant->\
                            dazong.owner->\
                            fin.owner->\
                            root.ceo...')
Exemplo n.º 4
0
    def audit_activity_normal_lifecycle(self,
                                        actions,
                                        config=None,
                                        submitDirectly=True,
                                        creator=None):
        self.perpareData()

        open_account_config = specs.createAuditConfig(
            spec='fin.open_account:_.owner->fin.owner->root.ceo...')
        baoxiao_config = specs.createAuditConfig(
            spec='fin.baoxiao:_.owner->fin.accountant->root.ceo')

        if config is None:
            config = baoxiao_config
        else:
            config = AuditActivityConfig.objects.get(subtype=config)

        client = Client()

        if creator is not None:
            creator = Profile.objects.get(name=creator)
        else:
            creator = self.jack

        token = generateToken(creator)
        response = client.post(
            '/api/v1/audit-activities',
            json.dumps({
                'config': str(config.pk),
                'submit': submitDirectly,
                'extra': {}
            }),
            content_type='application/json',
            HTTP_AUTHORIZATION=token
        )

        self.assertEquals(response.status_code, 200)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(result['ok'], True)

        activity = AuditActivity.objects.all()[0]
        self.assertEqual(activity.creator, creator)
        if submitDirectly:
            self.assertEqual(activity.state, AuditActivity.StateProcessing)
        else:
            self.assertEqual(activity.state, AuditActivity.StateDraft)
            self.assertEqual(len(activity.steps()), 0)

        if not submitDirectly:
            response = client.post(
                '/api/v1/audit-activities/{}/actions/submit-audit'.format(
                    str(activity.pk)),
                HTTP_AUTHORIZATION=token
            )
            self.assertEquals(response.status_code, 200)
            result = json.loads(response.content.decode('utf-8'))
            self.assertEqual(result['ok'], True)
            activity = AuditActivity.objects.all()[0]
            self.assertEqual(activity.state, AuditActivity.StateProcessing)

        steps = AuditStep.objects \
            .filter(activity=activity) \
            .order_by('position')

        if config.subtype == 'baoxiao':
            if creator.name == 'ceo':
                expect_steps = [
                    {'assignee': self.lucy},
                    {'assignee': self.ceo}
                ]
            else:
                expect_steps = [
                    {'assignee': self.lee},
                    {'assignee': self.lucy},
                    {'assignee': self.ceo}
                ]
        else:
            if creator.department.code == 'fin':
                expect_steps = [
                    {'assignee': self.neo},
                    {'assignee': self.ceo}
                ]
            else:
                expect_steps = [
                    {'assignee': self.lee},
                    {'assignee': self.neo},
                    {'assignee': self.ceo}
                ]

        for step in steps:
            es = expect_steps[step.position]
            self.assertEqual(es['assignee'], step.assignee)
            self.assertEqual(step.state, AuditStep.StatePending)

        for action in actions:
            if action == 'cancel':
                response = client.post(
                    '/api/v1/audit-activities/{}/actions/cancel'.format(
                        activity.pk),
                    content_type='application/json',
                    HTTP_AUTHORIZATION=token
                )
                self.assertEquals(response.status_code, 200)
            if action == 'approve':
                step = activity.currentStep()
                token = generateToken(step.assignee)
                response = client.post(
                    '/api/v1/audit-steps/{}/actions/approve'.format(step.pk),
                    content_type='application/json',
                    HTTP_AUTHORIZATION=token
                )
                self.assertEquals(response.status_code, 200)
            if action == 'reject':
                step = activity.currentStep()
                token = generateToken(step.assignee)
                response = client.post(
                    '/api/v1/audit-steps/{}/actions/reject'.format(step.pk),
                    content_type='application/json',
                    HTTP_AUTHORIZATION=token
                )
                self.assertEquals(response.status_code, 200)
Exemplo n.º 5
0
    def handle(self, *args, **options):
        roleSuperuser = Role.objects.create(name='超级管理员', extra=P_V1)
        roleMember = Role.objects.create(name='普通员工',
                                         extra=[
                                             P_V1_VIEW_HOME,
                                             P_V1_VIEW_HOME_ASSIGNED_AUDIT,
                                             P_V1_VIEW_HOME_MINE_AUDIT,
                                             P_V1_VIEW_LAUNCH_AUDIT,
                                             P_V1_LAUNCH_FIN_AUDIT,
                                             P_V1_LAUNCH_LAW_AUDIT,
                                             P_V1_VIEW_MINE_AUDIT,
                                             P_V1_VIEW_AUDIT_DETAIL,
                                             P_V1_CANCEL_AUDIT,
                                             P_V1_EDIT_AUDIT,
                                             P_V1_VIEW_PROFILE,
                                             P_V1_CHANE_PHONE,
                                         ])

        positions = [
            {
                'name': '总裁',
                'code': 'ceo'
            },
            {
                'name': '负责人',
                'code': 'owner'
            },  # 每个部门都也负责人

            # 财务中心
            {
                'name': '会计',
                'code': 'fin_accountant'
            },
            {
                'name': '出纳',
                'code': 'fin_cashier'
            },

            # 行政中心
            {
                'name': '行政专员',
                'code': 'hr_admin_member'
            },  # 行政专员
            {
                'name': '人事经理',
                'code': 'hr_mgr'
            },  # 人事经理
            {
                'name': '人事专员',
                'code': 'hr_member'
            },  # 人事专员

            # 大宗事业部岗位
            {
                'name': '业务经理',
                'code': 'dazong_mgr'
            },  # 业务经理
            {
                'name': '业务专员',
                'code': 'dazong_member'
            },  # 业务专员
        ]
        for pos in positions:
            Position.objects.create(**pos)

        departments = [
            {
                'name': '总部',
                'code': 'root',
                'positions': ['ceo']
            },
            {
                'name': '大宗商品事业部',
                'code': 'dazong',
                'positions': ['owner', 'dazong_mgr', 'dazong_member']
            },
            {
                'name': '财务中心',
                'code': 'fin',
                'positions': ['owner', 'fin_accountant', 'fin_cashier']
            },
            {
                'name': '人力行政中心',
                'code': 'hr',
                'positions':
                ['owner', 'hr_mgr', 'hr_admin_member', 'hr_member']
            },
            {
                'name': '地产事业部',
                'code': 'dichan',
                'positions': ['owner']
            },
            {
                'name': '金融事业部',
                'code': 'jinrong',
                'positions': []
            },
        ]
        for dep in departments:
            positions = dep['positions']
            del dep['positions']

            department = Department.objects.create(**dep)
            for pos in positions:
                position = Position.objects.get(code=pos)
                DepPos.objects.create(pos=position, dep=department)

        profiles = [
            {
                'name': 'ceo',
                'dep': 'root',
                'pos': 'ceo'
            },

            # 大宗事业部
            {
                'name': 'jack',
                'dep': 'dazong',
                'pos': 'owner'
            },
            {
                'name': 'mike',
                'dep': 'dazong',
                'pos': 'dazong_mgr'
            },
            {
                'name': 'tez',
                'dep': 'dazong',
                'pos': 'dazong_member'
            },

            # 财务中心
            {
                'name': 'tom',
                'dep': 'fin',
                'pos': 'owner'
            },
            {
                'name': 'telez',
                'dep': 'fin',
                'pos': 'fin_accountant'
            },
            {
                'name': 'messi',
                'dep': 'fin',
                'pos': 'fin_cashier'
            },

            # 人力行政中心
            {
                'name': 'jarvis',
                'dep': 'hr',
                'pos': 'owner'
            },
            {
                'name': 'young',
                'dep': 'hr',
                'pos': 'hr_member'
            },
            {
                'name': 'lufy',
                'dep': 'hr',
                'pos': 'hr_admin_member'
            },
            {
                'name': 'mina',
                'dep': 'hr',
                'pos': 'hr_mgr'
            },

            # 地产
            {
                'name': 'dollars',
                'dep': 'dichan',
                'pos': 'owner'
            },
        ]
        for profile in profiles:
            dep = Department.objects.get(code=profile['dep'])
            pos = Position.objects.get(code=profile['pos'])
            p = self.createProfile(profile['name'], dep, pos)
            if profile['name'] == 'ceo':
                p.role = roleSuperuser
                p.save()
            else:
                p.role = roleMember
                p.save()

        # 费用报销流程(总额<=5000)
        specs.createAuditConfig(spec='fin.cost_lte_5000:\
                                fin.fin_accountant->\
                                _.owner->\
                                hr.owner->\
                                fin.owner...')
        # 费用报销流程(总额>5000)
        specs.createAuditConfig(spec='fin.cost_gt_5000:\
                                fin.fin_accountant->\
                                _.owner->\
                                hr.owner->\
                                fin.owner->\
                                root.ceo...')

        # 差旅报销流程(总额<=5000)
        specs.createAuditConfig(spec='fin.travel_lte_5000:\
                                hr.hr_member->\
                                fin.fin_accountant->\
                                _.owner->\
                                hr.owner->\
                                fin.owner...')
        # 差旅报销流程(总额>5000)
        specs.createAuditConfig(spec='fin.travel_gt_5000:\
                                hr.hr_member->\
                                fin.fin_accountant->\
                                _.owner->\
                                hr.owner->\
                                fin.owner->\
                                root.ceo...')

        # 借款申请
        specs.createAuditConfig(spec='fin.loan_lte_5000:\
                                _.owner->\
                                fin.owner...')
        specs.createAuditConfig(spec='fin.loan_gt_5000:\
                                _.owner->\
                                fin.owner->\
                                root.ceo...')

        # 采购申请
        specs.createAuditConfig(
            spec='fin.purchase_lte_5000:_.owner->fin.owner...')
        specs.createAuditConfig(
            spec='fin.purchase_gt_5000:_.owner->fin.owner->root.ceo...')

        # 用款申请
        specs.createAuditConfig(
            spec='fin.money_caigou_or_other_lte_5k:_.owner->fin.owner...')
        specs.createAuditConfig(
            spec='fin.money_caigou_or_other:_.owner->fin.owner->root.ceo...')
        specs.createAuditConfig(spec='fin.money_lte_50k:_.owner->fin.owner...')
        specs.createAuditConfig(
            spec='fin.money_gt_50k:_.owner->fin.owner->root.ceo...')

        # 开户
        specs.createAuditConfig(
            spec='fin.open_account:_.owner->fin.owner->root.ceo...')

        # 业务合同会签
        specs.createAuditConfig(
            spec=
            'law.biz_contract:_.owner->fin.fin_accountant->fin.owner->root.ceo...'
        )

        # 职能类合同会签
        specs.createAuditConfig(
            spec='law.fn_contract_zero:_.owner->root.ceo...')
        specs.createAuditConfig(
            spec='law.fn_contract:_.owner->fin.owner->root.ceo...')

        # 测试用的审批流程
        specs.createAuditConfig(
            spec='test.test:root.ceo->root.ceo->root.ceo...')
def add_money_transfer_audit_flow(apps, schema_editor):
    specs.createAuditConfig(spec='fin.money_transfer:\
                                fin.fin_accountant->\
                                fin.owner->\
                                root.ceo...')