Changeset 7e10599


Ignore:
Timestamp:
01/07/23 19:19:10 (23 months ago)
Author:
DarkoSasanski <darko.sasanski@…>
Branches:
main
Children:
16f38d4
Parents:
497d129
Message:

implemented creating and negotiation of orders

Location:
FullyStocked/src/main
Files:
13 added
23 edited

Legend:

Unmodified
Added
Removed
  • FullyStocked/src/main/java/com/bazi/fullystocked/Models/Enumerations/OrderStatus.java

    r497d129 r7e10599  
    33public enum OrderStatus {
    44    CREATED("Created"),
     5    SENT("Sent"),
    56    APPROVED("Approved"),
    67    CANCELED("Canceled"),
  • FullyStocked/src/main/java/com/bazi/fullystocked/Models/OrderedArticles.java

    r497d129 r7e10599  
    1818    @GeneratedValue(strategy = GenerationType.IDENTITY)
    1919    private Integer oarticleid;
    20     @Min(0)
    21     private int price;
     20    private Integer price;
    2221    @Column(nullable = false)
    2322    @NotNull(message = "Ordered Article must have quantity")
     
    4342        this.location = location;
    4443        this.article = article;
     44        this.price= null;
    4545    }
    4646}
  • FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/ArticlesAndCategoriesReport.java

    r497d129 r7e10599  
    11package com.bazi.fullystocked.Models.SqlViews;
    22
     3import lombok.Getter;
    34import org.hibernate.annotations.Immutable;
    45
     
    1011@Entity
    1112@Immutable
     13@Getter
    1214@Table(name = "articles_and_cats_report")
    1315public class ArticlesAndCategoriesReport {
  • FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/ArticlesAtLocationReport.java

    r497d129 r7e10599  
    11package com.bazi.fullystocked.Models.SqlViews;
    22
     3import lombok.Getter;
    34import org.hibernate.annotations.Immutable;
    45
     
    910@Entity
    1011@Immutable
     12@Getter
    1113@Table(name = "articles_at_location")
    1214public class ArticlesAtLocationReport {
     
    1416    private Integer sarticleid;
    1517    private Integer locationid;
     18    private String locationname;
    1619    private Integer articleid;
    1720    private String description;
  • FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/InvoicedArticlesReport.java

    r497d129 r7e10599  
    22
    33import com.bazi.fullystocked.Models.Enumerations.ArticleStatus;
     4import lombok.Getter;
    45import org.hibernate.annotations.Immutable;
    56
     
    89@Entity
    910@Immutable
     11@Getter
    1012@Table(name = "invoiced_articles_report")
    1113public class InvoicedArticlesReport {
  • FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/OrderedArticlesReport.java

    r497d129 r7e10599  
    22
    33import com.bazi.fullystocked.Models.Enumerations.ArticleStatus;
     4import lombok.Getter;
     5import lombok.ToString;
    46import org.hibernate.annotations.Immutable;
    57
     
    810@Entity
    911@Immutable
     12@Getter
     13@ToString
    1014@Table(name = "ordered_articles_report")
    1115public class OrderedArticlesReport {
     
    1923    private int quantity;
    2024    private Integer locationid;
    21     private int price;
     25    private Integer price;
    2226    @Enumerated(EnumType.STRING)
    2327    private ArticleStatus articlestatus;
  • FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/SupplierSuppliesArticleReport.java

    r497d129 r7e10599  
    11package com.bazi.fullystocked.Models.SqlViews;
    22
     3import lombok.Getter;
    34import org.hibernate.annotations.Immutable;
    45
     
    910@Entity
    1011@Immutable
     12@Getter
    1113@Table(name = "supplier_supplies_article")
    1214public class SupplierSuppliesArticleReport {
     
    1416    private SupplierSuppliesArticleReportId id;
    1517    private String articlename;
     18    private String imageurl;
    1619}
  • FullyStocked/src/main/java/com/bazi/fullystocked/Repositories/ArticlesAtLocationRepository.java

    r497d129 r7e10599  
    99public interface ArticlesAtLocationRepository extends JpaRepository<ArticlesAtLocationReport, Integer> {
    1010    List<ArticlesAtLocationReport> findAllByLocationid(Integer id);
     11    List<ArticlesAtLocationReport> findAllByArticleid(Integer id);
    1112}
  • FullyStocked/src/main/java/com/bazi/fullystocked/Repositories/OrderedArticlesRepository.java

    r497d129 r7e10599  
    1717    List<OrderedArticles> findAllByOrder(Orders order);
    1818    Optional<OrderedArticles> findByOrderAndArticle(Orders order, Articles article);
     19    Optional<OrderedArticles> findByOrderAndArticleAndLocation(Orders order, Articles article, Locations location);
    1920    List<OrderedArticles> findAllByArticlestatus(ArticleStatus status);
    2021    List<OrderedArticles> findAllByLocationAndArticlestatus(Locations location, ArticleStatus status);
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/ArticlesService.java

    r497d129 r7e10599  
    22
    33import com.bazi.fullystocked.Models.Articles;
     4import com.bazi.fullystocked.Models.Categories;
     5import com.bazi.fullystocked.Models.SqlViews.ArticlesAtLocationReport;
     6import com.bazi.fullystocked.Models.SqlViews.SupplierSuppliesArticleReport;
     7
    48import java.util.*;
    59
     
    812    Optional<Articles> create(String description, String articlename, String imageurl, int maxquantityperlocation);
    913    Optional<Articles> addToCategory(Integer articleId, Integer categoryId);
     14    List<Categories> findAllCategoriesByArticle(Integer articleId);
     15    List<SupplierSuppliesArticleReport> findAllBySupplier(Integer id);
     16    List<ArticlesAtLocationReport> findAvailabilityAtAllLocations(Integer id);
     17
    1018}
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/ArticlesServiceImpl.java

    r497d129 r7e10599  
    44import com.bazi.fullystocked.Models.Categories;
    55import com.bazi.fullystocked.Models.Exceptions.InvalidArgumentsException;
     6import com.bazi.fullystocked.Models.SqlViews.ArticlesAtLocationReport;
     7import com.bazi.fullystocked.Models.SqlViews.SupplierSuppliesArticleReport;
     8import com.bazi.fullystocked.Repositories.ArticlesAtLocationRepository;
    69import com.bazi.fullystocked.Repositories.ArticlesRepository;
    710import com.bazi.fullystocked.Repositories.CategoriesRepository;
     11import com.bazi.fullystocked.Repositories.SupplierSuppliesArticleRepository;
    812import com.bazi.fullystocked.Services.ArticlesService;
    913import org.springframework.stereotype.Service;
    1014
    1115import javax.transaction.Transactional;
     16import java.util.List;
    1217import java.util.Optional;
    1318
     
    1621    private final ArticlesRepository articlesRepository;
    1722    private final CategoriesRepository categoriesRepository;
     23    private final SupplierSuppliesArticleRepository supplierSuppliesArticleRepository;
     24    private final ArticlesAtLocationRepository articlesAtLocationRepository;
    1825
    19     public ArticlesServiceImpl(ArticlesRepository articlesRepository, CategoriesRepository categoriesRepository) {
     26    public ArticlesServiceImpl(ArticlesRepository articlesRepository, CategoriesRepository categoriesRepository, SupplierSuppliesArticleRepository supplierSuppliesArticleRepository, ArticlesAtLocationRepository articlesAtLocationRepository) {
    2027        this.articlesRepository = articlesRepository;
    2128        this.categoriesRepository = categoriesRepository;
     29        this.supplierSuppliesArticleRepository = supplierSuppliesArticleRepository;
     30        this.articlesAtLocationRepository = articlesAtLocationRepository;
    2231    }
    2332
     
    4958        return Optional.of(articles);
    5059    }
     60
     61    @Override
     62    public List<Categories> findAllCategoriesByArticle(Integer articleId) {
     63        Articles articles=articlesRepository.findById(articleId).orElseThrow(InvalidArgumentsException::new);
     64        return articles.getCategoryList();
     65    }
     66
     67    @Override
     68    public List<SupplierSuppliesArticleReport> findAllBySupplier(Integer supplierId) {
     69        return supplierSuppliesArticleRepository.findAllById_Userid(supplierId);
     70    }
     71
     72    @Override
     73    public List<ArticlesAtLocationReport> findAvailabilityAtAllLocations(Integer id) {
     74        return articlesAtLocationRepository.findAllByArticleid(id);
     75    }
    5176}
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/LocationServiceImpl.java

    r497d129 r7e10599  
    11package com.bazi.fullystocked.Services.Implementations;
    22
     3import com.bazi.fullystocked.Models.Locations;
    34import com.bazi.fullystocked.Models.SqlViews.ArticlesAtLocationReport;
    45import com.bazi.fullystocked.Repositories.ArticlesAtLocationRepository;
     6import com.bazi.fullystocked.Repositories.LocationsRepository;
    57import com.bazi.fullystocked.Services.LocationsService;
    68import org.springframework.stereotype.Service;
     
    1113public class LocationServiceImpl implements LocationsService {
    1214    private final ArticlesAtLocationRepository articlesAtLocationRepository;
     15    private final LocationsRepository locationsRepository;
    1316
    14     public LocationServiceImpl(ArticlesAtLocationRepository articlesAtLocationRepository) {
     17    public LocationServiceImpl(ArticlesAtLocationRepository articlesAtLocationRepository, LocationsRepository locationsRepository) {
    1518        this.articlesAtLocationRepository = articlesAtLocationRepository;
     19        this.locationsRepository = locationsRepository;
    1620    }
    1721
     
    2024        return articlesAtLocationRepository.findAllByLocationid(locationid);
    2125    }
     26
     27    @Override
     28    public List<Locations> findAll() {
     29        return locationsRepository.findAll();
     30    }
    2231}
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/OrdersServiceImpl.java

    r497d129 r7e10599  
    88import com.bazi.fullystocked.Models.Exceptions.ArticleMaxQuantityException;
    99import com.bazi.fullystocked.Models.Exceptions.InvalidArgumentsException;
     10import com.bazi.fullystocked.Models.SqlViews.OrdersReport;
    1011import com.bazi.fullystocked.Repositories.*;
    1112import com.bazi.fullystocked.Services.OrdersService;
     
    1314
    1415import javax.transaction.Transactional;
     16import java.time.LocalDateTime;
    1517import java.util.List;
    1618import java.util.Optional;
     
    2527    private final LocationsRepository locationsRepository;
    2628    private final OrderedArticlesRepository orderedArticlesRepository;
     29    private final OrdersReportRepository ordersReportRepository;
    2730
    28     public OrdersServiceImpl(OrdersRepository ordersRepository, ManagersRepository managersRepository, SuppliersRepository suppliersRepository, ArticlesRepository articlesRepository, LocationsRepository locationsRepository, OrderedArticlesRepository orderedArticlesRepository) {
     31    public OrdersServiceImpl(OrdersRepository ordersRepository, ManagersRepository managersRepository, SuppliersRepository suppliersRepository, ArticlesRepository articlesRepository, LocationsRepository locationsRepository, OrderedArticlesRepository orderedArticlesRepository, OrdersReportRepository ordersReportRepository) {
    2932        this.ordersRepository = ordersRepository;
    3033        this.managersRepository = managersRepository;
     
    3336        this.locationsRepository = locationsRepository;
    3437        this.orderedArticlesRepository = orderedArticlesRepository;
     38        this.ordersReportRepository = ordersReportRepository;
    3539    }
    3640
     
    4953
    5054    @Override
     55    public List<OrdersReport> findAllByManagerReport(Integer managerId) {
     56        return ordersReportRepository.findAllByManageruserid(managerId);
     57    }
     58
     59    @Override
    5160    public List<Orders> findAllByManagerAndStatus(Integer managerId, OrderStatus status) {
    5261        Managers manager=managersRepository.findById(managerId).orElseThrow(InvalidArgumentsException::new);
     
    6069        Articles article=articlesRepository.findById(articleId).orElseThrow(InvalidArgumentsException::new);
    6170        Orders order=ordersRepository.findById(orderId).orElseThrow(InvalidArgumentsException::new);
    62         if(orderedArticlesRepository.findByOrderAndArticle(order, article).isPresent())
     71        if(!order.getStatus().equals(OrderStatus.CREATED))
     72        {
     73            throw new InvalidArgumentsException();
     74        }
     75        if(orderedArticlesRepository.findByOrderAndArticleAndLocation(order, article, location).isPresent())
    6376        {
    6477            throw new ArticleAlreadyInOrderException();
     
    102115
    103116    @Override
     117    public List<OrdersReport> findAllBySupplierReport(Integer supplierId) {
     118        return ordersReportRepository.findAllBySupplieruserid(supplierId);
     119    }
     120
     121    @Override
    104122    public List<Orders> findAllBySupplierAndStatus(Integer supplierId, OrderStatus status) {
    105123        Suppliers supplier=suppliersRepository.findById(supplierId).orElseThrow(InvalidArgumentsException::new);
     
    113131
    114132    @Override
     133    public Optional<OrdersReport> findByIdReport(Integer orderId) {
     134        return ordersReportRepository.findById(orderId);
     135    }
     136
     137    @Override
    115138    public Optional<Orders> updateStatus(Integer orderId, OrderStatus status) {
    116139        Orders order=ordersRepository.findById(orderId).orElseThrow(InvalidArgumentsException::new);
     
    119142            throw new InvalidArgumentsException();
    120143        }
    121         if(status.equals(OrderStatus.APPROVED) && !order.getStatus().equals(OrderStatus.CREATED))
     144        if(status.equals(OrderStatus.SENT) && !order.getStatus().equals(OrderStatus.CREATED))
    122145        {
    123146            throw new InvalidArgumentsException();
    124147        }
    125         if(status.equals(OrderStatus.REJECTED) && !order.getStatus().equals(OrderStatus.CREATED))
     148        if(status.equals(OrderStatus.APPROVED) && !order.getStatus().equals(OrderStatus.SENT))
     149        {
     150            throw new InvalidArgumentsException();
     151        }
     152        if(status.equals(OrderStatus.REJECTED) && !(order.getStatus().equals(OrderStatus.CREATED) || order.getStatus().equals(OrderStatus.SENT)))
    126153        {
    127154            throw new InvalidArgumentsException();
     
    157184            }
    158185        }
     186        if(status.equals(OrderStatus.APPROVED))
     187        {
     188            order.setDateapproved(LocalDateTime.now());
     189        }
    159190        order.setStatus(status);
    160191        return Optional.of(ordersRepository.save(order));
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/StoredArticlesServiceImpl.java

    r497d129 r7e10599  
    11package com.bazi.fullystocked.Services.Implementations;
    22
     3import com.bazi.fullystocked.Models.Categories;
    34import com.bazi.fullystocked.Models.Enumerations.ArticleStatus;
    45import com.bazi.fullystocked.Models.Enumerations.OrderStatus;
     
    2223@Service
    2324public class StoredArticlesServiceImpl implements StoredArticlesService {
    24     private final SupplierSuppliesArticleRepository supplierSuppliesArticleRepository;
    2525    private final OrderedArticlesRepository orderedArticlesRepository;
    2626    private final StoredArticlesRepository storedArticlesRepository;
     
    2828    private final ArticlesReportRepository articlesReportRepository;
    2929
    30     public StoredArticlesServiceImpl(SupplierSuppliesArticleRepository supplierSuppliesArticleRepository, OrderedArticlesRepository orderedArticlesRepository, StoredArticlesRepository storedArticlesRepository, OrdersService ordersService, ArticlesReportRepository articlesReportRepository) {
    31         this.supplierSuppliesArticleRepository = supplierSuppliesArticleRepository;
     30    public StoredArticlesServiceImpl(OrderedArticlesRepository orderedArticlesRepository, StoredArticlesRepository storedArticlesRepository, OrdersService ordersService, ArticlesReportRepository articlesReportRepository) {
    3231        this.orderedArticlesRepository = orderedArticlesRepository;
    3332        this.storedArticlesRepository = storedArticlesRepository;
     
    3635    }
    3736
    38     @Override
    39     public List<SupplierSuppliesArticleReport> findAllBySupplier(Integer supplierId) {
    40         return supplierSuppliesArticleRepository.findAllById_Userid(supplierId);
    41     }
    4237
    4338    @Override
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/SuppliersServiceImpl.java

    r497d129 r7e10599  
    11package com.bazi.fullystocked.Services.Implementations;
    22
     3import com.bazi.fullystocked.Models.SqlViews.SuppliersReport;
    34import com.bazi.fullystocked.Models.Suppliers;
     5import com.bazi.fullystocked.Repositories.SuppliersReportRepository;
    46import com.bazi.fullystocked.Repositories.SuppliersRepository;
    57import com.bazi.fullystocked.Services.SuppliersService;
     
    79
    810import java.util.List;
     11import java.util.Optional;
    912
    1013@Service
    1114public class SuppliersServiceImpl implements SuppliersService {
    1215    private final SuppliersRepository suppliersRepository;
     16    private final SuppliersReportRepository suppliersReportRepository;
    1317
    14     public SuppliersServiceImpl(SuppliersRepository suppliersRepository) {
     18    public SuppliersServiceImpl(SuppliersRepository suppliersRepository, SuppliersReportRepository suppliersReportRepository) {
    1519        this.suppliersRepository = suppliersRepository;
     20        this.suppliersReportRepository = suppliersReportRepository;
    1621    }
    1722
     
    2025        return suppliersRepository.findAll();
    2126    }
     27
     28    @Override
     29    public Optional<SuppliersReport> findByIdReport(Integer id) {
     30        return suppliersReportRepository.findById(id);
     31    }
     32
     33    @Override
     34    public List<SuppliersReport> findAllSuppliersReport() {
     35        return suppliersReportRepository.findAll();
     36    }
     37
     38    @Override
     39    public Optional<Suppliers> findById(Integer id) {
     40        return suppliersRepository.findById(id);
     41    }
    2242}
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/LocationsService.java

    r497d129 r7e10599  
    22
    33
     4import com.bazi.fullystocked.Models.Locations;
    45import com.bazi.fullystocked.Models.SqlViews.ArticlesAtLocationReport;
    56
     
    89public interface LocationsService {
    910    List<ArticlesAtLocationReport> findAllArticlesAtLocation(Integer locationid);
     11    List<Locations> findAll();
    1012}
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/OrdersService.java

    r497d129 r7e10599  
    44import com.bazi.fullystocked.Models.Enumerations.OrderStatus;
    55import com.bazi.fullystocked.Models.Orders;
     6import com.bazi.fullystocked.Models.SqlViews.OrdersReport;
     7import com.bazi.fullystocked.Repositories.OrdersReportRepository;
     8
    69import java.util.*;
    710
     
    912    Optional<Orders> create(OrderPriority priority, Integer managerId, Integer supplierId);
    1013    List<Orders> findAllByManager(Integer managerId);
     14    List<OrdersReport> findAllByManagerReport(Integer managerId);
    1115    List<Orders> findAllByManagerAndStatus(Integer managerId, OrderStatus status);
    1216    Optional<Orders> addArticleToOrder(int quantity, Integer locationId, Integer articleId, Integer orderId);
     
    1418    Optional<Orders> addSupplierRemark(Integer orderId, String remark);
    1519    List<Orders> findAllBySupplier(Integer supplierId);
     20    List<OrdersReport> findAllBySupplierReport(Integer supplierId);
    1621    List<Orders> findAllBySupplierAndStatus(Integer supplierId, OrderStatus status);
    1722    Optional<Orders> findById(Integer orderId);
     23    Optional<OrdersReport> findByIdReport(Integer orderId);
    1824    Optional<Orders> updateStatus(Integer orderId, OrderStatus status);
    1925
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/StoredArticlesService.java

    r497d129 r7e10599  
    22
    33
     4import com.bazi.fullystocked.Models.Categories;
    45import com.bazi.fullystocked.Models.SqlViews.ArticlesReport;
    56import com.bazi.fullystocked.Models.SqlViews.SupplierSuppliesArticleReport;
     
    910
    1011public interface StoredArticlesService {
    11     List<SupplierSuppliesArticleReport> findAllBySupplier(Integer supplierId);
    1212    Optional<StoredArticles> updateFromOrder(Integer oarticleid);
    1313    List<ArticlesReport> findByLocation(Integer locationId);
  • FullyStocked/src/main/java/com/bazi/fullystocked/Services/SuppliersService.java

    r497d129 r7e10599  
    11package com.bazi.fullystocked.Services;
    22
     3import com.bazi.fullystocked.Models.SqlViews.SuppliersReport;
    34import com.bazi.fullystocked.Models.Suppliers;
    45
     
    78public interface SuppliersService {
    89    List<Suppliers> findAll();
     10    Optional<SuppliersReport> findByIdReport(Integer id);
     11    List<SuppliersReport> findAllSuppliersReport();
     12    Optional<Suppliers> findById(Integer id);
    913}
  • FullyStocked/src/main/java/com/bazi/fullystocked/Web/Controller/InvoiceController.java

    r497d129 r7e10599  
    6464        if(invoicesService.findById(invoiceId).isEmpty())
    6565        {
    66             return "redirect:/create";
     66            return "redirect:/invoices/create";
    6767        }
    6868        try{
  • FullyStocked/src/main/java/com/bazi/fullystocked/Web/Controller/WorkerController.java

    r497d129 r7e10599  
    22
    33import com.bazi.fullystocked.Models.SqlViews.ArticlesReport;
    4 import com.bazi.fullystocked.Models.StoredArticles;
    5 import com.bazi.fullystocked.Models.User;
    64import com.bazi.fullystocked.Models.Workers;
     5import com.bazi.fullystocked.Services.ArticlesService;
    76import com.bazi.fullystocked.Services.StoredArticlesService;
    87import org.springframework.stereotype.Controller;
     
    1413import javax.servlet.http.HttpServletRequest;
    1514import java.util.List;
    16 import java.util.Optional;
    1715
    1816@Controller
     
    2018public class WorkerController {
    2119   private final StoredArticlesService storedArticlesService;
     20   private final ArticlesService articlesService;
    2221
    23     public WorkerController(StoredArticlesService storedArticlesService) {
     22    public WorkerController(StoredArticlesService storedArticlesService, ArticlesService articlesService) {
    2423        this.storedArticlesService = storedArticlesService;
     24        this.articlesService = articlesService;
    2525    }
    2626
     
    4646            ArticlesReport articlesReport=this.storedArticlesService.findById(id).get();
    4747            model.addAttribute("article",articlesReport);
     48            model.addAttribute("categories", articlesService.findAllCategoriesByArticle(articlesReport.getArticleid()));
    4849            return "detailsArticle";
    4950        }
  • FullyStocked/src/main/resources/templates/addInvoiceArticle.html

    r497d129 r7e10599  
    6464                            <span class="input-group-text inputGroup-sizing-sm">Количина</span>
    6565                        </div>
    66                         <input type="text" name="quantity" class="form-control" aria-label="Small" aria-describedby="inputGroup-sizing-sm">
     66                        <input type="number" name="quantity" class="form-control" aria-label="Small" aria-describedby="inputGroup-sizing-sm">
    6767                    </div>
    6868                    <div class="input-group input-group-sm mb-3">
     
    7070                            <span class="input-group-text inputGroup-sizing-sm">Цена</span>
    7171                        </div>
    72                         <input type="text" name="price" class="form-control" aria-label="Small" aria-describedby="inputGroup-sizing-sm">
     72                        <input type="number" name="price" class="form-control" aria-label="Small" aria-describedby="inputGroup-sizing-sm">
    7373                    </div>
    7474                    <input type="hidden" name="invoiceId" th:value="${invId}">
  • FullyStocked/src/main/resources/templates/detailsArticle.html

    r497d129 r7e10599  
    5757      </div><!-- / project-info-box -->
    5858
     59      <div class="project-info-box">
     60        <p><b>Категории: </b></p>
     61        <ul>
     62          <li th:each="cat : ${categories}">
     63            <span th:text="${cat.getCategoryname()}"></span>
     64          </li>
     65        </ul>
     66      </div><!-- / project-info-box -->
     67
    5968      <div class="project-info-box mt-0 mb-0">
    6069        <p class="mb-0">
Note: See TracChangeset for help on using the changeset viewer.