def setUp(self):
     super(ProjectResultTests, self).setUp()
     self.project_repository = ProjectRepository()
     self.project_result_repository = ProjectResultRepository()
     self.project_detail_repository = ProjectDetailRepository()
     self.project_billing_repository = ProjectBillingRepository()
     self.project_month_repository = ProjectMonthRepository()
Exemplo n.º 2
0
 def setUp(self):
     super(BpOrderReportTests, self).setUp()
     self.project_repository = ProjectRepository()
     self.user_repository = UserRepository()
     self.project_detail_repository = ProjectDetailRepository()
     self.engineer_repository = EngineerRepository()
     with app.test_request_context():
         project_detail = self.project_detail_repository.find_by_id(1)
         user = self.user_repository.find_by_id(1)
         session['user'] = user.serialize()
         bp_order_report = BpOrderReport(project_detail)
     self.bp_order_report = bp_order_report
class ProjectDetailService(object):
    project_repository = ProjectRepository()
    project_detail_repository = ProjectDetailRepository()
    order_sequence_repository = OrderSequenceRepository()

    def get_project_list_our_company(self, month):
        return self.project_detail_repository.get_project_list_our_company(
            month)

    def get_project_list_bp(self, month):
        return self.project_detail_repository.get_project_list_bp(month)

    def find_by_id(self, project_detail_id):
        return self.project_detail_repository.find_by_id(project_detail_id)

    def save(self, project_detail):

        if project_detail.has_payment(
        ) and project_detail.is_billing_start_day_change:
            fiscal_year = project_detail.get_fiscal_year()

            while True:
                order_sequence = self.order_sequence_repository.take_a_sequence(
                    fiscal_year)
                bp_order_no = order_sequence.get_bp_order_no()

                if not self.project_detail_repository.find_by_bp_order_no(
                        bp_order_no):
                    project_detail.bp_order_no = bp_order_no
                    break

        self.project_detail_repository.save(project_detail)

        # 見積金額合計を再計算する
        estimated_total_amount = 0
        project = self.project_repository.find_by_id(project_detail.project_id)
        for detail in project.project_details:
            estimated_total_amount += detail.billing_money or 0
        project.estimated_total_amount = estimated_total_amount
        self.project_repository.save(project)

    def destroy(self, project_detail):
        # 見積金額合計を再計算する
        estimated_total_amount = 0
        project = self.project_repository.find_by_id(project_detail.project_id)
        for detail in project.project_details:
            if detail.id != project_detail.id:
                estimated_total_amount += detail.billing_money or 0
        project.estimated_total_amount = estimated_total_amount
        self.project_repository.save(project)

        return self.project_detail_repository.destroy(project_detail)
Exemplo n.º 4
0
 def setUp(self):
     super(EstimatedReportTests, self).setUp()
     self.project_repository = ProjectRepository()
     self.user_repository = UserRepository()
     self.project_detail_repository = ProjectDetailRepository()
     self.engineer_repository = EngineerRepository()
     with app.test_request_context():
         project = self.project_repository.find_by_id(1)
         # 明細 = 作業
         project_detail_work = ProjectDetail(
             project_id=project.id,
             detail_type=DetailType.work,
             work_name='project_detail_work',
             billing_money=100000,
             created_at=datetime.today(),
             created_user='******',
             updated_at=datetime.today(),
             updated_user='******')
         project.project_details.append(project_detail_work)
         user = self.user_repository.find_by_id(1)
         session['user'] = user.serialize()
         estimated_report = EstimatedReport(project)
     self.estimated_report = estimated_report
Exemplo n.º 5
0
class BpOrderReportTests(BaseTestCase):
    @classmethod
    def setUpClass(cls):
        super(BpOrderReportTests, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        super(BpOrderReportTests, cls).tearDownClass()

    def setUp(self):
        super(BpOrderReportTests, self).setUp()
        self.project_repository = ProjectRepository()
        self.user_repository = UserRepository()
        self.project_detail_repository = ProjectDetailRepository()
        self.engineer_repository = EngineerRepository()
        with app.test_request_context():
            project_detail = self.project_detail_repository.find_by_id(1)
            user = self.user_repository.find_by_id(1)
            session['user'] = user.serialize()
            bp_order_report = BpOrderReport(project_detail)
        self.bp_order_report = bp_order_report

    def tearDown(self):
        super(BpOrderReportTests, self).tearDown()

    def test_get_payment_detail_text(self):
        # set_up
        engineer_history = EngineerHistory(engineer_id=1,
                                           payment_start_day=date(2017, 1, 1),
                                           payment_end_day=date(2017, 2, 28),
                                           payment_site=Site.twenty_five,
                                           payment_tax=Tax.eight,
                                           payment_per_month=100000,
                                           payment_rule=Rule.variable,
                                           payment_per_top_hour=1000,
                                           payment_per_bottom_hour=2000,
                                           created_at=datetime.today(),
                                           created_user='******',
                                           updated_at=datetime.today(),
                                           updated_user='******')

        expected = "test0 氏  ¥100,000.-/月額"\
            + "\n        "\
            + "超過単価:¥1,000.-/H  "\
            + "欠業単価:¥2,000.-/H"

        # テスト対象のメソッドを実行
        text = self.bp_order_report.get_payment_detail_text(engineer_history)
        self.assertEqual(text, expected)
Exemplo n.º 6
0
 def setUp(self):
     super(ProjectBillingTests, self).setUp()
     self.project_billing_repository = ProjectBillingRepository()
     self.project_month_repository = ProjectMonthRepository()
     self.billing_sequence_repository = BillingSequenceRepository()
     self.project_detail_repository = ProjectDetailRepository()
Exemplo n.º 7
0
class ProjectBillingTests(BaseTestCase):

    @classmethod
    def setUpClass(cls):
        super(ProjectBillingTests, cls).setUpClass()

    def setUp(self):
        super(ProjectBillingTests, self).setUp()
        self.project_billing_repository = ProjectBillingRepository()
        self.project_month_repository = ProjectMonthRepository()
        self.billing_sequence_repository = BillingSequenceRepository()
        self.project_detail_repository = ProjectDetailRepository()

    def tearDown(self):
        super(ProjectBillingTests, self).tearDown()

    # 請求タブに遷移する。
    def test_get_project_billing(self):
        # ログインする
        shain_number = 'test1'
        self.app.post('/login', data={
            'shain_number': shain_number,
            'password': '******'
        })
        project_billing = self.project_month_repository.find_all()[0]

        result = self.app.get('/project/billing/' + str(project_billing.project.id))
        self.assertEqual(result.status_code, 200)

    # 存在しないプロジェクトの場合はnot_found
    def test_get_project_billing_fail(self):
        # ログインする
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        result = self.app.get('/project/billing/0')
        self.assertEqual(result.status_code, 404)

    # 請求詳細画面に遷移する。
    def test_get_project_billing_month(self):
        # ログインする
        shain_number = 'test1'
        self.app.post('/login', data={
            'shain_number': shain_number,
            'password': '******'
        })
        project_billing = self.project_month_repository.find_all()[0]

        result = self.app.get('/project/billing/month/' + str(project_billing.id))
        self.assertEqual(result.status_code, 200)

    # 存在しないプロジェクト年月の場合はnot_found
    def test_get_project_billing_month_fail(self):
        # ログインする
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        result = self.app.get('/project/billing/month/0')
        self.assertEqual(result.status_code, 404)

    # 請求詳細画面を保存できる
    def test_save_project_billing_month(self):
        shain_number = 'test1'
        self.app.post('/login', data={
            'shain_number': shain_number,
            'password': '******'
        })
        project_month = self.project_month_repository.find_all()[0]

        expected = '単体テスト_変更'
        project_billing_id = project_month.id

        result = self.app.post('/project/billing/month/' + str(project_billing_id), data={
            'client_billing_no': expected,
            'billing_confirmation_money': project_month.billing_confirmation_money,
            'billing_tax': project_month.billing_tax.value,
            'billing_transportation': project_month.billing_transportation,
            'deposit_date': project_month.deposit_date.strftime('%Y/%m/%d'),
            'remarks': project_month.remarks
        })
        # 保存できることを確認
        self.assertEqual(result.status_code, 302)
        ok_('/project/billing/month/' + str(project_month.id) in result.headers['Location'])

        project_month = self.project_month_repository.find_by_id(project_billing_id)
        actual = project_month.client_billing_no
        self.assertEqual(actual, expected)

    # 存在しない請求の場合はnot_found
    def test_get_billing_project_detail_fail(self):
        # ログインする
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        result = self.app.get('/project/billing/detail/0')
        self.assertEqual(result.status_code, 404)

    # 請求情報を保存できる
    def test_save_project_billing_detail(self):
        shain_number = 'test1'
        self.app.post('/login', data={
            'shain_number': shain_number,
            'password': '******'
        })
        billing = self.project_billing_repository.find_all()[0]

        expected = '単体テスト_変更'
        billing_id = billing.id

        result = self.app.post('/project/billing/detail/' + str(billing_id), data={
            'billing_content': expected,
            'billing_amount': billing.billing_amount,
            'billing_confirmation_money': billing.billing_confirmation_money,
            'billing_transportation': billing.billing_transportation
        })
        # 保存できることを確認
        self.assertEqual(result.status_code, 302)
        ok_('/project/billing/detail/' + str(billing.id) in result.headers['Location'])

        billing = self.project_billing_repository.find_by_id(billing_id)
        actual = billing.billing_content
        self.assertEqual(actual, expected)

    # 請求情報を削除できる
    def test_delete_billing(self):
        # 削除用の請求情報を登録
        billing = ProjectBilling(
            project_detail_id=1,
            billing_month=date(2017, 1, 1).strftime('%Y/%m/%d'),
            billing_amount='1人月',
            billing_content='削除用請求',
            billing_confirmation_money=1000,
            billing_transportation=100,
            remarks='テスト',
            created_at=datetime.today(),
            created_user='******',
            updated_at=datetime.today(),
            updated_user='******')
        db.session.add(billing)
        db.session.commit()

        delete_billing_id = billing.id

        # ログイン
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })
        billing = self.project_billing_repository.find_by_id(delete_billing_id)

        result = self.app.get('/project/billing/delete/' + str(billing.id))
        # 削除できることを確認
        self.assertEqual(result.status_code, 302)
        ok_('/project/billing/month/' in result.headers['Location'])

        # 削除した請求が存在しないことを確認
        billing = self.project_billing_repository.find_by_id(delete_billing_id)
        self.assertIsNone(billing.id)

    # 存在しない会社は削除できない
    def test_delete_billing_fail(self):
        before = len(self.project_billing_repository.find_all())
        # ログイン
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        result = self.app.get('/project/billing/delete/0')
        # 削除できることを確認
        self.assertEqual(result.status_code, 302)
        ok_('/project/' in result.headers['Location'])

        after = len(self.project_billing_repository.find_all())
        # 前後で件数が変わっていないことを確認
        self.assertEqual(before, after)

    # 請求詳細画面に遷移する。
    def test_get_detail_billing(self):
        # ログインする
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        billing = self.project_billing_repository.find_all()[0]

        result = self.app.get('/project/billing/detail/' + str(billing.id))
        self.assertEqual(result.status_code, 200)

    # 存在しない請求の場合はnot_found
    def project_billing_repository(self):
        # ログインする
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        result = self.app.get('/project/billing/0')
        self.assertEqual(result.status_code, 404)

    # 。請求済みフラグが更新されることを確認する
    def test_save_flag(self):
        # ログインする
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        project_month_id = 5
        project_month = self.project_month_repository.find_by_id(project_month_id)

        # 請求入力済みフラグをチェック有りで更新する。
        excepted = InputFlag.done.value

        headers = [('X-Requested-With', 'XMLHttpRequest')]
        result = self.app.post('/project/billing/save_flag',
                               headers=headers,
                               data={
                                    'month_id': project_month.id,
                                    'input_flag': excepted
                               })
        self.assertEqual(result.status_code, 200)

        # DBのbilling_input_flag値が1になっていることを確認。
        project_month = self.project_month_repository.find_by_id(5)
        actual_input_flag = project_month.billing_input_flag.value
        self.assertEqual(actual_input_flag, excepted)

    def test_save_flag_fail(self):
        # ログインする
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        # xhrではない場合
        result = self.app.post('/project/billing/save_flag', data={
                                    'month_id': '2',
                                    'input_flag': InputFlag.done.value
                               })
        self.assertEqual(result.status_code, 404)

    # client_billing_noが発番されることを確認。
    def test_create_client_billing_no(self):
        shain_number = 'test1'
        self.app.post('/login', data={
            'shain_number': shain_number,
            'password': '******'
        })
        project_month = self.project_month_repository.find_all()[0]
        project_billing_id = project_month.id

        result = self.app.post('/project/billing/month/' + str(project_billing_id), data={
            'client_billing_no': '',
            'billing_confirmation_money': project_month.billing_confirmation_money,
            'billing_tax': Tax.eight.value,
            'billing_transportation': project_month.billing_transportation,
            'deposit_date': project_month.deposit_date.strftime('%Y/%m/%d'),
            'remarks': project_month.remarks
        })
        # 保存できることを確認
        self.assertEqual(result.status_code, 302)
        ok_('/project/billing/month/' + str(project_month.id) in result.headers['Location'])

        project_month = self.project_month_repository.find_by_id(project_billing_id)
        actual = project_month.client_billing_no
        self.assertIsNotNone(actual)

    # 請求番号が重複しない
    def test_duplicate_client_billing_no(self):
        # ログイン
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        # 2017年度のシーケンスを取得
        billing_sequence = self.billing_sequence_repository.find_by_fiscal_year(17)

        # 連番が一つ先の注文書番号を登録しておく。
        client_billing_no = 'B' + str(billing_sequence.fiscal_year)\
                            + '-'\
                            + '{0:03d}'.format(billing_sequence.sequence + 1)

        project_month = ProjectMonth(
                            project_id=1,
                            project_month='2016/10/1',
                            billing_input_flag=InputFlag.yet,
                            deposit_input_flag=InputFlag.yet,
                            deposit_date='2016/10/1',
                            billing_estimated_money=10000,
                            billing_confirmation_money=10000,
                            billing_transportation=100,
                            remarks='remarks',
                            client_billing_no=client_billing_no,
                            created_at=datetime.today(),
                            created_user='******',
                            updated_at=datetime.today(),
                            updated_user='******')
        db.session.add(project_month)
        db.session.commit()

        # 新規作成時に発番が期待される注文書番号
        expected = 'B' + str(billing_sequence.fiscal_year)\
                   + '-'\
                   + '{0:03d}'.format(billing_sequence.sequence + 2)

        project_month = self.project_month_repository.find_all()[4]
        project_month.project_month = date(2016, 10, 1)
        db.session.add(project_month)
        db.session.commit()

        result = self.app.post('/project/billing/month/' + str(project_month.id), data={
            'client_billing_no': '',
            'billing_confirmation_money': project_month.billing_confirmation_money,
            'billing_tax': project_month.billing_tax.value,
            'billing_transportation': project_month.billing_transportation,
            'deposit_date': project_month.deposit_date.strftime('%Y/%m/%d'),
            'remarks': project_month.remarks
        })
        # 保存できることを確認
        self.assertEqual(result.status_code, 302)
        ok_('/project/billing/month/' + str(project_month.id) in result.headers['Location'])

        # 更新後のデータを確認する。
        actual = project_month.client_billing_no

        self.assertEqual(actual, expected)

    # 同じ顧客請求Noは登録できない
    def test_not_register_duplicate_client_billing_no(self):
        duplicate_client_billing_no = 'duplicate_client_billing_no'
        project_month = ProjectMonth(
                            project_id=1,
                            project_month='2016/10/1',
                            billing_input_flag=InputFlag.yet,
                            deposit_input_flag=InputFlag.yet,
                            deposit_date='2016/10/1',
                            billing_estimated_money=10000,
                            billing_confirmation_money=10000,
                            billing_transportation=100,
                            remarks='remarks',
                            client_billing_no=duplicate_client_billing_no,
                            created_at=datetime.today(),
                            created_user='******',
                            updated_at=datetime.today(),
                            updated_user='******')
        db.session.add(project_month)
        db.session.commit()

        project_month = self.project_month_repository.find_all()[4]
        project_month.project_month = date(2016, 10, 1)
        db.session.add(project_month)
        db.session.commit()

        result = self.app.post('/project/billing/month/' + str(project_month.id), data={
            'client_billing_no': duplicate_client_billing_no,
            'billing_confirmation_money': project_month.billing_confirmation_money,
            'billing_transportation': project_month.billing_transportation,
            'deposit_date': project_month.deposit_date.strftime('%Y/%m/%d'),
            'remarks': project_month.remarks
        })
        # 保存できない事を確認
        self.assertEqual(result.status_code, 200)

    # 請求明細登録画面に遷移する。
    def test_get_billing_create(self):
        # ログインする
        shain_number = 'test1'
        self.app.post('/login', data={
            'shain_number': shain_number,
            'password': '******'
        })
        project_month = self.project_month_repository.find_all()[0]

        result = self.app.get('/project/billing/create/' + str(project_month.id))
        self.assertEqual(result.status_code, 200)

    # 存在しないプロジェクト年月の場合はnot_found
    def test_create_billing_fail(self):
        # ログインする
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        result = self.app.get('/project/billing/create/0')
        self.assertEqual(result.status_code, 404)

    # 請求明細を新規登録できる
    def test_create_billing(self):
        shain_number = 'test1'
        self.app.post('/login', data={
            'shain_number': shain_number,
            'password': '******'
        })
        billing = self.project_billing_repository.find_all()[0]
        project_month = self.project_month_repository.find_project_month_at_a_month(billing.project_detail.project.id,
                                                                                    billing.billing_month)

        expected = '単体テスト_登録'
        result = self.app.post('/project/billing/create/' + str(project_month.id), data={
            'billing_content': expected,
            'billing_amount': billing.billing_amount,
            'billing_confirmation_money': billing.billing_confirmation_money,
            'billing_transportation': billing.billing_transportation
        })
        # 保存できることを確認
        self.assertEqual(result.status_code, 302)
        billing_id = result.headers['Location'].split('/')[-1]
        ok_('/project/billing/detail/' + str(billing_id) in result.headers['Location'])

        billing = self.project_billing_repository.find_by_id(billing_id)
        actual = billing.billing_content
        self.assertEqual(actual, expected)

    # validationチェックに引っかかって請求明細を保存できない。
    def test_create_billing_validation_error(self):
        shain_number = 'test1'
        self.app.post('/login', data={
            'shain_number': shain_number,
            'password': '******'
        })
        billing = self.project_billing_repository.find_all()[0]
        project_month = self.project_month_repository.find_project_month_at_a_month(billing.project_detail.project.id,
                                                                                    billing.billing_month)

        result = self.app.post('/project/billing/create/' + str(project_month.id), data={
            'billing_content': '',
            'billing_amount': '',
            'billing_confirmation_money': '',
            'billing_transportation': ''
        })
        # 保存できないことを確認
        self.assertEqual(result.status_code, 200)

    # 請求書をダウンロード
    def test_billing_report_download(self):
        # ログイン
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        project_month = self.project_month_repository.find_all()[0]
        project_month.billing_printed_date = None

        # 帳票作成実行
        result = self.app.get('/project/billing/billing_report_download/' + str(project_month.id))
        self.assertEqual(result.status_code, 200)

    # 請求明細が大量に存在する請求書をダウンロード
    def test_billing_report_download_when_project_detail_over_15(self):
        # ログイン
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        # set_up
        project_month = self.project_month_repository.find_by_id(4)
        project_month.deposit_date = None
        project_month.project.client_order_no = '11111-0170'
        project_month.project.client_company.billing_tax = Tax.eight
        project_detail = self.project_detail_repository.find_by_id(1)
        project_month.billing_printed_date = date(2017, 1, 1)

        for i in range(20):
            project_billing = ProjectBilling(
                project_detail_id=project_detail.id,
                billing_month=date(2017, 4, 1).strftime('%Y/%m/%d'),
                billing_amount='1人月',
                billing_content='削除用請求',
                billing_confirmation_money=1000,
                billing_transportation=100,
                remarks='テスト',
                created_at=datetime.today(),
                created_user='******',
                updated_at=datetime.today(),
                updated_user='******')
            project_detail.project_billings.append(project_billing)

        # 帳票作成実行
        result = self.app.get('/project/billing/billing_report_download/' + str(project_month.id))
        self.assertEqual(result.status_code, 200)

    # 納品書をダウンロードする
    def test_delivery_report_download(self):
        # ログイン
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        project_month = self.project_month_repository.find_all()[0]
        project_month.billing_printed_date = None

        # 帳票作成実行
        result = self.app.get('/project/billing/delivery_report_download/' + str(project_month.id))
        self.assertEqual(result.status_code, 200)

    # 請求明細が大量に存在する納品書をダウンロード
    def test_delivery_report_download_when_project_detail_over_15(self):
        # ログイン
        self.app.post('/login', data={
            'shain_number': 'test1',
            'password': '******'
        })

        # set_up
        project_month = self.project_month_repository.find_by_id(4)
        project_month.deposit_date = None
        project_month.project.client_order_no = '11111-0170'
        project_month.project.client_company.billing_tax = Tax.eight
        project_detail = self.project_detail_repository.find_by_id(1)
        project_month.billing_printed_date = date(2017, 1, 1)

        for i in range(20):
            project_billing = ProjectBilling(
                project_detail_id=project_detail.id,
                billing_month=date(2017, 4, 1).strftime('%Y/%m/%d'),
                billing_amount='1人月',
                billing_content='削除用請求',
                billing_confirmation_money=1000,
                billing_transportation=100,
                remarks='テスト',
                created_at=datetime.today(),
                created_user='******',
                updated_at=datetime.today(),
                updated_user='******')
            project_detail.project_billings.append(project_billing)

        # 帳票作成実行
        result = self.app.get('/project/billing/delivery_report_download/' + str(project_month.id))
        self.assertEqual(result.status_code, 200)
Exemplo n.º 8
0
from wtforms.validators import ValidationError

from application.controllers.form.fields import IntegerField, RadioField, SelectFieldWithDisable, \
    BeginningOfMonthField, EndOfMonthField
from application.controllers.form.validators import Length, DataRequired, InputRequired, LessThan, NumberRange
from application.domain.model.immutables.detail_type import DetailType
from application.domain.model.immutables.fraction import Fraction
from application.domain.model.immutables.round import Round
from application.domain.model.immutables.rule import Rule
from application.domain.repository.project_detail_repository import ProjectDetailRepository
from application.service.engineer_history_service import EngineerHistoryService
from application.service.engineer_service import EngineerService

service = EngineerService()
engineer_history_service = EngineerHistoryService()
project_detail_repository = ProjectDetailRepository()


# 明細区分で作業者を選択した場合、入力必須にする。
def required_if_engineer(form, field):
    if form.detail_type.data == str(
            DetailType.engineer) and (not field.raw_data
                                      or not field.raw_data[0]):
        raise ValidationError(field.label.text + 'は必須です。')


# 明細区分で作業を選択した場合、入力必須にする。
def required_if_work(form, field):
    if form.detail_type.data == str(
            DetailType.work) and (not field.raw_data or not field.raw_data[0]):
        raise ValidationError(field.label.text + 'は必須です。')
class ProjectResultTests(BaseTestCase):
    @classmethod
    def setUpClass(cls):
        super(ProjectResultTests, cls).setUpClass()

    def setUp(self):
        super(ProjectResultTests, self).setUp()
        self.project_repository = ProjectRepository()
        self.project_result_repository = ProjectResultRepository()
        self.project_detail_repository = ProjectDetailRepository()
        self.project_billing_repository = ProjectBillingRepository()
        self.project_month_repository = ProjectMonthRepository()

    def tearDown(self):
        super(ProjectResultTests, self).tearDown()

    # 実績一覧に遷移する。
    def test_get_project_result(self):
        # ログインする
        self.app.post('/login',
                      data={
                          'shain_number': 'test1',
                          'password': '******'
                      })

        project = self.project_repository.find_by_id(1)

        result = self.app.get('/project/result/' + str(project.id))
        self.assertEqual(result.status_code, 200)

    # 実績登録画面に遷移する。
    def test_get_result(self):
        # ログインする
        self.app.post('/login',
                      data={
                          'shain_number': 'test1',
                          'password': '******'
                      })

        project_result = self.project_result_repository.find_all()[0]

        result = self.app.get('/project/result/detail/' +
                              str(project_result.id))
        self.assertEqual(result.status_code, 200)

    # 存在しない実績の場合はnot_found
    def test_get_result_fail(self):
        # ログインする
        self.app.post('/login',
                      data={
                          'shain_number': 'test1',
                          'password': '******'
                      })

        result = self.app.get('/project/result/detail/0')
        self.assertEqual(result.status_code, 404)

    # 実績を保存できる
    def test_save_result(self):
        shain_number = 'test1'
        self.app.post('/login',
                      data={
                          'shain_number': shain_number,
                          'password': '******'
                      })
        project_result = self.project_result_repository.find_all()[0]

        expected = Decimal(300)
        project_result_id = project_result.id

        result = self.app.post('/project/result/detail/' +
                               str(project_result_id),
                               data={'work_time': expected})
        # 保存できることを確認
        self.assertEqual(result.status_code, 302)
        ok_('/project/result/detail/' +
            str(project_result.id) in result.headers['Location'])

        project_result = self.project_result_repository.find_by_id(
            project_result_id)
        actual = project_result.work_time
        self.assertEqual(actual, expected)

    # 明細がengineerの場合、実績を更新すると同月の請求情報が新規作成される。
    def test_create_engineer_billing_when_update_result(self):
        before = len(self.project_billing_repository.find_all())
        # ログイン
        self.app.post('/login',
                      data={
                          'shain_number': 'test1',
                          'password': '******'
                      })

        # set_up
        project = Project(project_name='test_copy_project',
                          project_name_for_bp='copy_project',
                          status=Status.start,
                          recorded_department_id=1,
                          sales_person='営業担当',
                          estimation_no='M0001-11',
                          end_user_company_id=4,
                          client_company_id=3,
                          start_date=date(2017, 1, 1),
                          end_date=date(2017, 12, 31),
                          contract_form=Contract.blanket,
                          billing_timing=BillingTiming.billing_at_last,
                          estimated_total_amount=1000000,
                          scope='test',
                          contents=None,
                          working_place=None,
                          delivery_place=None,
                          deliverables=None,
                          inspection_date=None,
                          responsible_person=None,
                          quality_control=None,
                          subcontractor=None,
                          remarks=None,
                          created_at=datetime.today(),
                          created_user='******',
                          updated_at=datetime.today(),
                          updated_user='******')
        db.session.add(project)
        db.session.commit()

        engineer = Engineer(engineer_name='エンジニア',
                            company_id=5,
                            created_at=datetime.today(),
                            created_user='******',
                            updated_at=datetime.today(),
                            updated_user='******')
        db.session.add(engineer)
        db.session.commit()

        history = EngineerHistory(engineer_id=engineer.id,
                                  payment_start_day=date(2016, 1, 1),
                                  payment_end_day=date(2099, 12, 31),
                                  payment_per_month=600000,
                                  payment_rule=Rule.fixed,
                                  payment_site=engineer.company.payment_site,
                                  payment_tax=engineer.company.payment_tax,
                                  created_at=datetime.today(),
                                  created_user='******',
                                  updated_at=datetime.today(),
                                  updated_user='******')
        db.session.add(history)
        db.session.commit()

        result = self.app.post('/project/contract/create?project_id=' +
                               str(project.id),
                               data={
                                   'detail_type':
                                   DetailType.engineer,
                                   'engineer_id':
                                   engineer.id,
                                   'billing_money':
                                   '100000000',
                                   'billing_start_day':
                                   date(2017, 1, 1).strftime('%Y/%m'),
                                   'billing_end_day':
                                   date(2017, 3, 1).strftime('%Y/%m'),
                                   'billing_per_month':
                                   '100000',
                                   'billing_rule':
                                   Rule.fixed.value,
                                   'billing_fraction_rule':
                                   '',
                               })
        self.assertEqual(result.status_code, 302)
        ok_('/project/contract/detail/' in result.headers['Location'])
        project_detail_id = result.headers['Location'].split('/')[-1]

        result = self.app.post('/project/contract/' + str(project.id),
                               data={
                                   'status':
                                   Status.done.value,
                                   'recorded_department_id':
                                   project.recorded_department_id,
                                   'estimation_no':
                                   project.estimation_no,
                                   'project_name':
                                   project.project_name,
                                   'end_user_company_id':
                                   str(project.end_user_company_id),
                                   'client_company_id':
                                   str(project.client_company_id),
                                   'start_date':
                                   project.start_date.strftime('%Y/%m/%d'),
                                   'end_date':
                                   project.end_date.strftime('%Y/%m/%d'),
                                   'contract_form':
                                   project.contract_form.value,
                                   'billing_timing':
                                   project.billing_timing.value
                               })
        self.assertEqual(result.status_code, 302)
        ok_('/project/contract' in result.headers['Location'])

        project_detail = self.project_detail_repository.find_by_id(
            project_detail_id)
        project_result_id = project_detail.project_results[0].id

        # 実績を保存する。
        result = self.app.post('/project/result/detail/' +
                               str(project_result_id),
                               data={
                                   'work_time': '160.0',
                                   'billing_confirmation_money': '1000'
                               })
        self.assertEqual(result.status_code, 302)
        ok_('/project/result/detail/' +
            str(project_result_id) in result.headers['Location'])

        # 請求のレコードが増えていることを確認する。
        after1 = len(self.project_billing_repository.find_all())
        self.assertEqual(before + 1, after1)

        # もう一度実績を保存すると既存の請求情報が更新されるため、請求のレコードが増えないことを確認する。
        result = self.app.post('/project/result/detail/' +
                               str(project_result_id),
                               data={
                                   'work_time': '160.0',
                                   'billing_confirmation_money': '1000'
                               })
        self.assertEqual(result.status_code, 302)
        ok_('/project/result/detail/' +
            str(project_result_id) in result.headers['Location'])

        # 請求のレコード数が増えていないことを確認。
        after2 = len(self.project_billing_repository.find_all())
        self.assertEqual(after1, after2)

    # 請求確定金額がブランクの場合、請求情報が作成されるない
    def test_do_not_create_billing_when_billing_confirmation_money_none(self):
        before = len(self.project_billing_repository.find_all())
        # ログイン
        self.app.post('/login',
                      data={
                          'shain_number': 'test1',
                          'password': '******'
                      })

        # set_up
        project = Project(project_name='テスト',
                          project_name_for_bp='テスト',
                          status=Status.start,
                          recorded_department_id=1,
                          sales_person='営業担当',
                          estimation_no='do_not_create_bill',
                          end_user_company_id=4,
                          client_company_id=3,
                          start_date=date(2017, 1, 1),
                          end_date=date(2017, 12, 31),
                          contract_form=Contract.blanket,
                          billing_timing=BillingTiming.billing_at_last,
                          estimated_total_amount=1000000,
                          scope='test',
                          contents=None,
                          working_place=None,
                          delivery_place=None,
                          deliverables=None,
                          inspection_date=None,
                          responsible_person=None,
                          quality_control=None,
                          subcontractor=None,
                          remarks=None,
                          created_at=datetime.today(),
                          created_user='******',
                          updated_at=datetime.today(),
                          updated_user='******')
        db.session.add(project)
        db.session.commit()

        engineer = Engineer(engineer_name='エンジニア',
                            company_id=5,
                            created_at=datetime.today(),
                            created_user='******',
                            updated_at=datetime.today(),
                            updated_user='******')
        db.session.add(engineer)
        db.session.commit()

        history = EngineerHistory(engineer_id=engineer.id,
                                  payment_start_day=date(2016, 1, 1),
                                  payment_end_day=date(2099, 12, 31),
                                  payment_per_month=600000,
                                  payment_rule=Rule.fixed,
                                  payment_site=engineer.company.payment_site,
                                  payment_tax=engineer.company.payment_tax,
                                  created_at=datetime.today(),
                                  created_user='******',
                                  updated_at=datetime.today(),
                                  updated_user='******')
        db.session.add(history)
        db.session.commit()

        result = self.app.post('/project/contract/create?project_id=' +
                               str(project.id),
                               data={
                                   'detail_type':
                                   DetailType.engineer,
                                   'engineer_id':
                                   engineer.id,
                                   'billing_money':
                                   '100000000',
                                   'billing_start_day':
                                   date(2017, 1, 1).strftime('%Y/%m'),
                                   'billing_end_day':
                                   date(2017, 3, 1).strftime('%Y/%m'),
                                   'billing_per_month':
                                   '100000',
                                   'billing_rule':
                                   Rule.fixed.value,
                                   'billing_fraction_rule':
                                   '',
                               })
        self.assertEqual(result.status_code, 302)
        ok_('/project/contract/detail/' in result.headers['Location'])
        project_detail_id = result.headers['Location'].split('/')[-1]

        result = self.app.post('/project/contract/' + str(project.id),
                               data={
                                   'status':
                                   Status.done.value,
                                   'recorded_department_id':
                                   project.recorded_department_id,
                                   'estimation_no':
                                   project.estimation_no,
                                   'project_name':
                                   project.project_name,
                                   'end_user_company_id':
                                   str(project.end_user_company_id),
                                   'client_company_id':
                                   str(project.client_company_id),
                                   'start_date':
                                   project.start_date.strftime('%Y/%m/%d'),
                                   'end_date':
                                   project.end_date.strftime('%Y/%m/%d'),
                                   'contract_form':
                                   project.contract_form.value,
                                   'billing_timing':
                                   project.billing_timing.value
                               })
        self.assertEqual(result.status_code, 302)
        ok_('/project/contract' in result.headers['Location'])

        project_detail = self.project_detail_repository.find_by_id(
            project_detail_id)
        project_result_id = project_detail.project_results[0].id

        # 実績を保存する。
        result = self.app.post('/project/result/detail/' +
                               str(project_result_id),
                               data={
                                   'work_time': '160.0',
                                   'billing_confirmation_money': ''
                               })
        self.assertEqual(result.status_code, 302)
        ok_('/project/result/detail/' +
            str(project_result_id) in result.headers['Location'])

        # 請求のレコード数が増えていないことを確認。
        after = len(self.project_billing_repository.find_all())
        self.assertEqual(before, after)

    # validationチェックに引っかかって実績を保存できない。
    def test_save_result_validation_error(self):
        shain_number = 'test1'
        self.app.post('/login',
                      data={
                          'shain_number': shain_number,
                          'password': '******'
                      })
        project_result = self.project_result_repository.find_all()[0]

        project_result_id = project_result.id

        result = self.app.post('/project/result/detail/' +
                               str(project_result_id),
                               data={
                                   'work_time': 'aaa',
                                   'payment_transportation': 10000000000,
                                   'payment_adjustments': -10000000000
                               })
        # 保存できないことを確認
        self.assertEqual(result.status_code, 200)
Exemplo n.º 10
0
class EstimatedReportTests(BaseTestCase):
    @classmethod
    def setUpClass(cls):
        super(EstimatedReportTests, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        super(EstimatedReportTests, cls).tearDownClass()

    def setUp(self):
        super(EstimatedReportTests, self).setUp()
        self.project_repository = ProjectRepository()
        self.user_repository = UserRepository()
        self.project_detail_repository = ProjectDetailRepository()
        self.engineer_repository = EngineerRepository()
        with app.test_request_context():
            project = self.project_repository.find_by_id(1)
            # 明細 = 作業
            project_detail_work = ProjectDetail(
                project_id=project.id,
                detail_type=DetailType.work,
                work_name='project_detail_work',
                billing_money=100000,
                created_at=datetime.today(),
                created_user='******',
                updated_at=datetime.today(),
                updated_user='******')
            project.project_details.append(project_detail_work)
            user = self.user_repository.find_by_id(1)
            session['user'] = user.serialize()
            estimated_report = EstimatedReport(project)
        self.estimated_report = estimated_report

    def tearDown(self):
        super(EstimatedReportTests, self).tearDown()

    def test_write_estimated_content_rows_if_blanket(self):
        # set_up
        self.estimated_report.project.contract_form = Contract.blanket

        # テスト対象のメソッドを実行
        self.estimated_report.write_estimated_content_rows()

        # 指定のセルに値が入っていることを確認。
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "estimation_no")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         self.estimated_report.project.estimation_no)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "printed_date")
        self.assertIsNotNone(
            self.estimated_report.ws[defined_name_range].value)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "client_company_name")
        self.assertEqual(
            self.estimated_report.ws[defined_name_range].value,
            self.estimated_report.project.client_company.company_name)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "project_name")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         self.estimated_report.project.project_name)
        start_date = datetime(self.estimated_report.project.start_date.year,
                              self.estimated_report.project.start_date.month,
                              self.estimated_report.project.start_date.day)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "start_date")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         strjpftime(start_date, '  %O%E年%m月%d日'))
        end_date = datetime(self.estimated_report.project.end_date.year,
                            self.estimated_report.project.end_date.month,
                            self.estimated_report.project.end_date.day)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "end_date")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         strjpftime(end_date, '  %O%E年%m月%d日'))
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "billing_timing")
        self.assertEqual(
            self.estimated_report.ws[defined_name_range].value,
            self.estimated_report.project.billing_timing.name_for_report)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "contract_form")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         self.estimated_report.project.contract_form.name)

    def test_write_estimated_content_rows_if_not_blanket(self):
        # set_up
        self.estimated_report.project.contract_form = Contract.time_and_material

        # テスト対象のメソッドを実行
        self.estimated_report.write_estimated_content_rows()

        # 指定のセルに値が入っていることを確認。
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "estimation_no")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         self.estimated_report.project.estimation_no)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "printed_date")
        self.assertIsNotNone(
            self.estimated_report.ws[defined_name_range].value)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "client_company_name")
        self.assertEqual(
            self.estimated_report.ws[defined_name_range].value,
            self.estimated_report.project.client_company.company_name)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "project_name")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         self.estimated_report.project.project_name)
        start_date = datetime(self.estimated_report.project.start_date.year,
                              self.estimated_report.project.start_date.month,
                              self.estimated_report.project.start_date.day)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "start_date")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         strjpftime(start_date, '  %O%E年%m月%d日'))
        end_date = datetime(self.estimated_report.project.end_date.year,
                            self.estimated_report.project.end_date.month,
                            self.estimated_report.project.end_date.day)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "end_date")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         strjpftime(end_date, '  %O%E年%m月%d日'))
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "billing_timing")
        self.assertEqual(
            self.estimated_report.ws[defined_name_range].value,
            self.estimated_report.project.billing_timing.name_for_report)
        defined_name_range = self.estimated_report.excel.get_defined_name_range(
            "contract_form")
        self.assertEqual(self.estimated_report.ws[defined_name_range].value,
                         self.estimated_report.project.contract_form.name)

    def test_create_project_detail_rows_if_project_details_over_3(self):
        # テスト対象のメソッドを実行
        self.estimated_report.create_project_detail_rows()

        # プロジェクト明細が指定のセルに値が入っていることを確認(※1行のみ)。
        self.assertEqual(self.estimated_report.ws['B24'].value, 1)
        self.assertEqual(
            self.estimated_report.ws['C24'].value, self.estimated_report.
            project.project_details[0].engineer.engineer_name)
        self.assertEqual(
            self.estimated_report.ws['G24'].value,
            self.estimated_report.project.project_details[0].billing_money)
        self.assertEqual(
            self.estimated_report.ws['H24'].value,
            self.estimated_report.project.project_details[0].remarks)
        # 消費税が指定のセルに値が入っていることを確認。
        self.assertEqual(self.estimated_report.ws['C30'].value, '消費税(なし)')
        self.assertEqual(
            self.estimated_report.ws['G30'].value,
            self.estimated_report.project.tax_of_estimated_total_amount())
        # 合計が指定のセルに値が入っていることを確認。
        self.assertEqual(self.estimated_report.ws['C31'].value, '合計')
        self.assertEqual(
            self.estimated_report.ws['G31'].value,
            self.estimated_report.project.estimated_total_amount +
            self.estimated_report.project.tax_of_estimated_total_amount())

    def test_create_project_detail_rows_if_project_details_below_2(self):
        # set_up
        project = self.project_repository.find_by_id(2)
        project_detail = self.project_detail_repository.find_all()[1]
        project.project_details.append(project_detail)
        self.estimated_report.project = project

        # テスト対象のメソッドを実行
        self.estimated_report.create_project_detail_rows()

        # プロジェクト明細が指定のセルに値が入っていることを確認(※1行のみ)。
        self.assertEqual(self.estimated_report.ws['B24'].value, 1)
        self.assertEqual(
            self.estimated_report.ws['C24'].value, self.estimated_report.
            project.project_details[0].engineer.engineer_name)
        self.assertEqual(
            self.estimated_report.ws['G24'].value,
            self.estimated_report.project.project_details[0].billing_money)
        self.assertEqual(
            self.estimated_report.ws['H24'].value,
            self.estimated_report.project.project_details[0].remarks)
        # 消費税が指定のセルに値が入っていることを確認。
        self.assertEqual(self.estimated_report.ws['C25'].value, '消費税(なし)')
        self.assertEqual(
            self.estimated_report.ws['G25'].value,
            self.estimated_report.project.tax_of_estimated_total_amount())
        # 合計が指定のセルに値が入っていることを確認。
        self.assertEqual(self.estimated_report.ws['C26'].value, '合計')
        self.assertEqual(
            self.estimated_report.ws['G26'].value,
            self.estimated_report.project.estimated_total_amount +
            self.estimated_report.project.tax_of_estimated_total_amount())

    def test_create_contract_content_rows(self):
        # テスト対象のメソッドを実行
        self.estimated_report.current_row = 32
        self.estimated_report.create_contract_content_rows()

        # 指定のセルに値が入っていることを確認。
        self.assertEqual(self.estimated_report.ws['B32'].value, '作業内容')
        self.assertEqual(self.estimated_report.ws['E32'].value,
                         self.estimated_report.project.contents)
        self.assertEqual(self.estimated_report.ws['B33'].value, '納品物')
        self.assertEqual(self.estimated_report.ws['E33'].value,
                         self.estimated_report.project.deliverables)
        self.assertEqual(self.estimated_report.ws['B34'].value, '作業場所')
        self.assertEqual(self.estimated_report.ws['E34'].value,
                         self.estimated_report.project.working_place)
        self.assertEqual(self.estimated_report.ws['B35'].value, '検査完了日')
        self.assertEqual(self.estimated_report.ws['E35'].value,
                         self.estimated_report.project.inspection_date)
        self.assertEqual(self.estimated_report.ws['B36'].value, '作業責任者')
        self.assertEqual(self.estimated_report.ws['E36'].value,
                         self.estimated_report.project.responsible_person)
        self.assertEqual(self.estimated_report.ws['B37'].value, '品質管理担当者')
        self.assertEqual(self.estimated_report.ws['E37'].value,
                         self.estimated_report.project.quality_control)
        self.assertEqual(self.estimated_report.ws['B38'].value, '再委託先')
        self.assertEqual(self.estimated_report.ws['E38'].value,
                         self.estimated_report.project.subcontractor)
        self.assertEqual(self.estimated_report.ws['B39'].value, '備考')
        self.assertEqual(self.estimated_report.ws['E39'].value,
                         self.estimated_report.project.remarks)

    def test_create_contract_content_rows_if_billing_by_month(self):
        # set_up
        project = self.project_repository.find_by_id(2)
        project_detail = self.project_detail_repository.find_all()[1]
        project.project_details.append(project_detail)
        self.estimated_report.project = project

        # テスト対象のメソッドを実行
        self.estimated_report.current_row = 32
        self.estimated_report.create_contract_content_rows()

        # 指定のセルに値が入っていることを確認。
        self.assertEqual(self.estimated_report.ws['B32'].value, '作業内容')
        self.assertEqual(self.estimated_report.ws['E32'].value,
                         self.estimated_report.project.contents)
        self.assertEqual(self.estimated_report.ws['B33'].value, '納品物')
        self.assertEqual(self.estimated_report.ws['E33'].value,
                         self.estimated_report.project.deliverables)
        self.assertEqual(self.estimated_report.ws['B34'].value, '作業場所')
        self.assertEqual(self.estimated_report.ws['E34'].value,
                         self.estimated_report.project.working_place)
        self.assertEqual(self.estimated_report.ws['B35'].value, '検査完了日')
        self.assertEqual(self.estimated_report.ws['E35'].value, '毎月月末')
        self.assertEqual(self.estimated_report.ws['B36'].value, '作業責任者')
        self.assertEqual(self.estimated_report.ws['E36'].value,
                         self.estimated_report.project.responsible_person)
        self.assertEqual(self.estimated_report.ws['B37'].value, '品質管理担当者')
        self.assertEqual(self.estimated_report.ws['E37'].value,
                         self.estimated_report.project.quality_control)
        self.assertEqual(self.estimated_report.ws['B38'].value, '再委託先')
        self.assertEqual(self.estimated_report.ws['E38'].value,
                         self.estimated_report.project.subcontractor)
        self.assertEqual(self.estimated_report.ws['B39'].value, '備考')
        self.assertEqual(self.estimated_report.ws['E39'].value,
                         self.estimated_report.project.remarks)