Skip to content

4. TP ۱: مدیریت پایهٔ یک برگهٔ پرداخت

4.1. Introduction

برای عملی کردن آنچه تاکنون آموخته‌ایم، اکنون پروژه‌ای را پیشنهاد می‌کنیم که شامل توسعه یک کلاینت اندروید برای تبلت‌ها است و برای شبیه‌سازی محاسبات حقوق و دستمزد کارکنان یک مؤسسه خیریه طراحی شده است.

این برنامه دارای معماری کلاینت/سرور خواهد بود:

Image

  • سرور [1] فراهم شده است؛
  • شما باید کلاینت اندروید [2] را بسازید.

4.2. پایگاه داده

4.2.1. تعریف

داده‌های ثابتی که برای تولید فیش حقوقی لازم است در پایگاه‌دادهٔ dbpam ذخیره خواهد شد. این پایگاه‌داده شامل جداول زیر است:

جدول EMPLOYES: حاوی اطلاعات مربوط به مراقبان مختلف کودک است

ساختار:

ID
کلید اصلی
VERSION
شماره نسخه – با هر اصلاح در سطر افزایش می‌یابد
SS
شماره بیمه اجتماعی ملی کارمند – منحصر به فرد
NOM
نام کارمند
PRENOM
نام کوچک آنها
ADRESSE
آدرس آنها
VILLE
شهر او
CODEPOSTAL
کد پستی او
INDEMNITE_ID
کلید خارجی روی فیلد [ID] در جدول [INDEMNITES]

محتوای آن می‌تواند به شرح زیر باشد:

Image

جدول COTISATIONS: شامل درصدهای مورد نیاز برای محاسبه حق بیمه تأمین اجتماعی است

ساختار:

ID
کلید اصلی
VERSION
شماره نسخه – با هر تغییر در سطر افزایش می‌یابد
CSGRDS
درصد: مشارکت اجتماعی کلی + مشارکت در بازپرداخت بدهی اجتماعی
CSGD
درصد: سهم اجتماعی عمومی قابل کسر
SECU
درصد: تأمین اجتماعی، مستمری بیوگی، مستمری پیری
RETRAITE
درصد: مستمری تکمیلی + بیمه بیکاری

محتوای آن می‌تواند به شرح زیر باشد:

Image

نرخ‌های حق بیمه تأمین اجتماعی به کارمند بستگی ندارند. جدول بالا تنها شامل یک سطر است.

جدول INDEMNITES: شامل داده‌های مورد نیاز برای محاسبه حقوق قابل پرداخت است.
ID
کلید اصلی
VERSION
شماره نسخه – با هر تغییر در سطر افزایش می‌یابد
INDICE
شاخص پردازش – یکتا
BASEHEURE
قیمت خالص به یورو برای یک ساعت آماده‌باش
ENTRETIENJOUR
کمک‌هزینه نگهداری به یورو برای هر روز مراقبت
REPASJOUR
مبلغ کمک‌هزینه غذا به یورو برای هر روز مراقبت از کودک
INDEMNITESCP
اضافه حقوق تعطیلات. این درصد است که باید به حقوق پایه اعمال شود.

محتوای آن می‌تواند به شرح زیر باشد:

Image

شایان ذکر است که مزایای دریافتی ممکن است از یک پرستار کودک به دیگری متفاوت باشد. این مزایا در واقع از طریق گروه حقوق به هر پرستار کودک خاص مرتبط هستند. برای مثال، خانم ماری جووینال که رتبه حقوق ۲ (جدول EMPLOYES) دارد، دستمزد ساعتی ۲.۱ یورو (جدول INDEMNITES) است.

4.2.2. تولید

اسکریپت تولید پایگاه داده [dbpam_hibernate.sql] ارائه شده است:

  

پایگاه داده [dbpam_hibernate] را ایجاد کنید (این نام پایگاه داده BD است که توسط وب سرور / jSON استفاده می‌شود) و اطمینان حاصل کنید که ورود root (بدون رمز عبور) می‌تواند به آن دسترسی داشته باشد. شما می‌توانید این کار را به شرح زیر انجام دهید:

MySQL را اجرا کنید و سپس [PhpMyAdmin] را:

 
  • [1-2]: اسکریپت [dbpam_hibernate.sql] را وارد کرده و سپس آن را اجرا کنید؛

4.2.3. مدل‌سازی پایگاه داده جاوا

عناصر جداول [EMPLOYES]، [INDEMNITES] و [COTISATIONS] توسط کلاس‌های زیر مدل‌سازی شده‌اند:

[Employe]


package pam.entities;

import java.io.Serializable;

public class Employe implements Serializable {

  private static final long serialVersionUID = 1L;
  private Long id;
  private int version;
  private String SS;
  private String nom;
  private String prenom;
  private String adresse;
  private String ville;
  private String codePostal;
  private int idIndemnite;
  private Indemnite indemnite;

  public Employe() {
  }

  public Employe(String SS, String nom, String prenom, String adresse, String ville, String codePostal, Indemnite indemnite) {
    ...
  }
   // گیرنده‌ها و تنظیم‌کننده‌ها
....
}
  • رده‌های ۸ تا ۱۵: این فیلدها با ستون‌های جدول [EMPLOYES] مطابقت دارند؛
  • خط ۱۶: فیلد [indemniteId] با ستون [INDEMNITE_ID] مطابقت دارد که کلید خارجی جدول [EMPLOYES] است؛
  • خط ۱۷: فوق‌العاده کارمند. این فیلد همیشه پر نمی‌شود:
    • هنگام درخواست URL [/employes]، پر نمی‌شود،
    • بلکه هنگام درخواست URL و [/salaire] است؛

[Indemnite]


package pam.entities;

import java.io.Serializable;

public class Indemnite implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;
    private int version;
    private int indice;
    private double baseHeure;
    private double entretienJour;
    private double repasJour;
    private double indemnitesCp;

    public Indemnite() {
    }

    public Indemnite(int indice, double baseHeure, double entretienJour, double repasJour, double indemnitesCP) {
        ...
    }

     // گیرنده و تنظیم‌کننده‌ها
   ....
}
  • رده‌های ۸–۱۴: فیلدها با ستون‌های جدول [INDEMNITES] مطابقت دارند؛

[Cotisation]


package pam.entities;

import java.io.Serializable;

public class Cotisation implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;
    private int version;
    private double csgrds;
    private double csgd;
    private double secu;
    private double retraite;

    public Cotisation() {
    }

    public Cotisation(double csgrds, double csgd, double secu, double retraite) {
        ...
    }
    // گیرنده و تنظیم‌کننده‌ها
   ...
}
  • خطوط ۸–۱۳: فیلدها با ستون‌های جدول [COTISATIONS] مطابقت دارند؛

4.3. نصب وب‌سرور / jSON

4.3.1. نصب

بینیری جاوا برای وب‌سرور / jSON ارائه شده است:

 

برای راه‌اندازی وب‌سرور / jSON، مراحل زیر را دنبال کنید:

  • دستور SGBD MySQL را اجرا کنید؛
  • اطمینان حاصل کنید که BD و [dbpam_hibernate] وجود دارند؛
  • یک پنجره DOS را باز کنید؛
  • به پوشه jar بروید؛
  • دستور را تایپ کنید:
java -jar pam-server-01-all-1.0.jar

این فرض را در نظر می‌گیرد که باینری [java.exe] در دایرکتوری PATH روی سیستم شما قرار دارد. اگر این‌طور نباشد، مسیر کامل [java.exe] را وارد کنید، برای مثال:

D:\Programs\devjava\java\jdk1.8\bin\java -jar pam-server-01-all-1.0.jar

برخی گزارش‌ها نمایش داده می‌شوند:

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.1.1.RELEASE)

2014-10-22 16:45:23.347  INFO 1868 --- [           main] pam.boot.BootWeb                         : Starting BootWeb on Gportpers3 with PID 1868 (D:\Temp\14-10-22\pam\server-pam.jar started by ST in D:\Temp\14-10-22\pam)
2014-10-22 16:45:23.414  INFO 1868 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@689ab9e2: startup date [Wed Oct 22 16:45:23 CEST 2014]; root of context hierarchy
...
...
2014-10-22 16:45:31.147  INFO 1868 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
2014-10-22 16:45:31.484  INFO 1868 --- [           main] o.h.h.i.ast.ASTQueryTranslatorFactory    : HHH000397: Using ASTQueryTranslatorFactory
2014-10-22 16:45:33.564  INFO 1868 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-10-22 16:45:33.804  INFO 1868 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/salaire/{SS}/{ht}/{jt}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public pam.restapi.FeuilleSalaireResponse pam.restapi.PamController.getFeuilleSalaire(java.lang.String,double,int)
2014-10-22 16:45:33.805  INFO 1868 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/employes],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public pam.restapi.EmployesResponse pam.restapi.PamController.getEmployes()
2014-10-22 16:45:33.807  INFO 1868 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2014-10-22 16:45:33.807  INFO 1868 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
2014-10-22 16:45:33.839  INFO 1868 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-10-22 16:45:33.839  INFO 1868 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-10-22 16:45:34.384  INFO 1868 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2014-10-22 16:45:34.535  INFO 1868 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080/http
2014-10-22 16:45:34.538  INFO 1868 --- [           main] pam.boot.BootWeb                         : Started BootWeb in 11.916 seconds (JVM running for 12.725)
2014-10-22 16:45:39.329  INFO 1868 --- [       Thread-2] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@689ab9e2: startup date [Wed Oct 22 16:45:23 CEST 2014]; root of context hierarchy
2014-10-22 16:45:39.331  INFO 1868 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
2014-10-22 16:45:39.333  INFO 1868 --- [       Thread-2] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
  • خط ۱۶: URL [/salaire/{SS}/{ht}/{jt}] شناسایی شد؛
  • خط ۱۷: URL و [/employes] شناسایی شدند؛

4.3.2. URL از سرویس وب/jSON

سرویس وب / jSON توسط Spring MVC پیاده‌سازی شده و دو URL را ارائه می‌دهد:


@RequestMapping(value = "/employes", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public EmployesResponse getEmployes() {
...
@RequestMapping(value = "/salaire/{SS}/{ht}/{jt}", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public FeuilleSalaireResponse getFeuilleSalaire(@PathVariable("SS") String SS, @PathVariable("ht") double ht, @PathVariable("jt") int jt) {

سرویس وب دو درخواست URL زیر را می‌پذیرد:

  • خط ۱: /کارمندان: برای بازیابی فهرست کارمندان؛
  • خط ۴: /salary/SS/ht/jt: برای بازیابی فیش حقوقی کارمندی با شناسه [SS] که [ht] ساعت در [jt] روز کار کرده است؛

در اینجا چند اسکرین‌شات برای نمایش این موضوع آورده شده است.

ما در حال درخواست کارمندان هستیم:

Image

ما پایگاه داده را خاموش کرده، سرور را مجدداً راه‌اندازی می‌کنیم و کارمندان را استعلام می‌گیریم:

Image

ما یک حقوق را استعلام می‌کنیم:

Image

ما حقوق یک شخص وجود ندارد را درخواست می‌کنیم:

Image

4.3.3. پاسخ‌ها jSON از سرویس وب/jSON

  

سرویس وب URL / jSON پاسخ‌هایی از نوع [Response<T>] ارسال می‌کند:


package client.android.dao.service;

import java.util.List;

public class Response<T> {

    // ----------------- ویژگی‌ها
    //وضعیت تراکنش
    private int status;
    // هر پیام وضعیت
    private List<String> messages;
    // بدنه پاسخ
    private T body;

    // سازنده‌ها
    public Response() {

    }

    public Response(int status, List<String> messages, T body) {
        this.status = status;
        this.messages = messages;
        this.body = body;
    }

    // گیرنده و تنظیم‌کننده
...
}
  • URL و [/employes] نوع Response<List<Employee>> را بازمی‌گردانند؛
  • URL و [/salaire] نوع Response<FeuilleSalaire> را برمی‌گردانند؛

کلاس [FeuilleSalaire] به شرح زیر است:


package pam.entities;

import java.io.Serializable;

public class FeuilleSalaire implements Serializable {

    private static final long serialVersionUID = 1L;
    // fields خصوصی
    private Employe employe;
    private Cotisation cotisation;
    private ElementsSalaire elementsSalaire;

    // سازنده‌ها
    public FeuilleSalaire() {
    }

    public FeuilleSalaire(Employe employe, Cotisation cotisation, ElementsSalaire elementsSalaire) {
        ...
    }

    // گیرنده‌ها و تنظیم‌کننده‌ها
   ...
}
  • خط ۹: کلاس [Employe] در بخش ۴.۲.۳ ارائه شد؛
  • خط ۱۰: کلاس [Cotisation] در بخش ۴.۲.۳ ارائه شد؛

کلاس [ElementsSalaire] (خط ۱۱) به شرح زیر است:


package pam.entities;

import java.io.Serializable;

public class ElementsSalaire implements Serializable {

    private static final long serialVersionUID = 1L;
    // میدان‌های خصوصی
    private double salaireBase;
    private double cotisationsSociales;
    private double indemnitesEntretien;
    private double indemnitesRepas;
    private double salaireNet;

    // سازنده‌ها
    public ElementsSalaire() {

    }

    public ElementsSalaire(double salaireBase, double cotisationsSociales, double indemnitesEntretien, double indemnitesRepas, double salaireNet) {
        ...
    }

    // گیرنده‌ها و تنظیم‌کننده‌ها
    ...
}

4.4. تست‌های کلاینت اندروید

بینیار اجرایی کلاینت اندروید آماده زیر ارائه شده است:

  

با استفاده از ماوس خود، باینری [pam-client.apk] را که در بالا نشان داده شده است، روی شبیه‌ساز تبلت [GenyMotion] بکشید. سپس ذخیره و اجرا خواهد شد. همچنین اگر قبلاً این کار را انجام نداده‌اید، وب‌سرور / jSON را نیز راه‌اندازی کنید. هدف کلاینت اندروید دریافت اطلاعاتی است که توسط سرور وب / jSON بازگردانده می‌شود و قالب‌بندی آن است. نماهای مختلف کلاینت اندروید به شرح زیر است:

ابتدا باید به سرویس وب / jSON متصل شوید:

Image

  • در [1]، URL را از سرویس وب / jSON وارد کنید. با استفاده از شبیه‌ساز، یکی از آدرس‌های IP را از PC وارد کنید (اما نه 127.0.0.1). روی تبلت، آدرس وای‌فای ماشین وب‌سرور / jSON را وارد کرده و در صورتی که فایروال دارد، آن را غیرفعال کنید، زیرا ممکن است درخواست‌های ورودی را مسدود کند؛
  • در [2]، وارد شوید؛

سپس به صفحه شبیه‌سازی هدایت می‌شوید:

Image

  • در [3]، یک کارمند را انتخاب کنید؛
  • در [4]، تعداد ساعاتی را وارد کنید؛
  • در [5]، تعداد روزها را وارد کنید؛
  • در [6]، شبیه‌سازی را اجرا کنید؛

صفحه شبیه‌سازی نمایش داده شده به شرح زیر است:

Image

  • در [7]، نتیجه شبیه‌سازی؛
  • در [8]، آن را ذخیره می‌کنید؛

Image

  • در [9]، فهرست شبیه‌سازی‌ها؛
  • در [10]، یک شبیه‌سازی حذف می‌شود؛

Image

  • در [11]، دیگر شبیه‌سازی‌ای وجود ندارد؛
  • در [12]، بازگشت به فرم شبیه‌سازی؛

Image

  • در [13]، فرم دوباره ظاهر می‌شود؛
  • در [14]، به صفحه پیکربندی بازمی‌گردید؛

Image

  • در [15]، به فرم ورود اولیه بازمی‌گردید.

4.5. وظیفه

چارچوب کلاینت اندروید که پیش‌تر معرفی شد، در اختیار شما قرار گرفته است. این چارچوب از پروژه [client-android-skel] که در پاراگراف ۲ توصیف شده، ساخته شده است.

  

این پروژه قابل اجرا است و از قبل شامل ویو‌های لازم می‌باشد. شما تنها باید مقداری کد اضافه کنید تا برنامه همان کاری را که باید انجام دهد، انجام دهد. رویه‌ای که باید دنبال کنید به شرح زیر است:

  • نسخه کامل را اجرا کنید تا با حجم کار آشنا شوید؛
  • نسخهٔ ساده‌شده را اجرا کرده و کد آن را مطالعه کنید. این نسخه مطابق روش‌های طراحی به‌کاررفته در صفحات قبلی است؛
  • کدهای گمشده را اضافه کنید؛