Changeset 7e10599
- Timestamp:
- 01/07/23 19:19:10 (2 years ago)
- Branches:
- main
- Children:
- 16f38d4
- Parents:
- 497d129
- 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 3 3 public enum OrderStatus { 4 4 CREATED("Created"), 5 SENT("Sent"), 5 6 APPROVED("Approved"), 6 7 CANCELED("Canceled"), -
FullyStocked/src/main/java/com/bazi/fullystocked/Models/OrderedArticles.java
r497d129 r7e10599 18 18 @GeneratedValue(strategy = GenerationType.IDENTITY) 19 19 private Integer oarticleid; 20 @Min(0) 21 private int price; 20 private Integer price; 22 21 @Column(nullable = false) 23 22 @NotNull(message = "Ordered Article must have quantity") … … 43 42 this.location = location; 44 43 this.article = article; 44 this.price= null; 45 45 } 46 46 } -
FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/ArticlesAndCategoriesReport.java
r497d129 r7e10599 1 1 package com.bazi.fullystocked.Models.SqlViews; 2 2 3 import lombok.Getter; 3 4 import org.hibernate.annotations.Immutable; 4 5 … … 10 11 @Entity 11 12 @Immutable 13 @Getter 12 14 @Table(name = "articles_and_cats_report") 13 15 public class ArticlesAndCategoriesReport { -
FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/ArticlesAtLocationReport.java
r497d129 r7e10599 1 1 package com.bazi.fullystocked.Models.SqlViews; 2 2 3 import lombok.Getter; 3 4 import org.hibernate.annotations.Immutable; 4 5 … … 9 10 @Entity 10 11 @Immutable 12 @Getter 11 13 @Table(name = "articles_at_location") 12 14 public class ArticlesAtLocationReport { … … 14 16 private Integer sarticleid; 15 17 private Integer locationid; 18 private String locationname; 16 19 private Integer articleid; 17 20 private String description; -
FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/InvoicedArticlesReport.java
r497d129 r7e10599 2 2 3 3 import com.bazi.fullystocked.Models.Enumerations.ArticleStatus; 4 import lombok.Getter; 4 5 import org.hibernate.annotations.Immutable; 5 6 … … 8 9 @Entity 9 10 @Immutable 11 @Getter 10 12 @Table(name = "invoiced_articles_report") 11 13 public class InvoicedArticlesReport { -
FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/OrderedArticlesReport.java
r497d129 r7e10599 2 2 3 3 import com.bazi.fullystocked.Models.Enumerations.ArticleStatus; 4 import lombok.Getter; 5 import lombok.ToString; 4 6 import org.hibernate.annotations.Immutable; 5 7 … … 8 10 @Entity 9 11 @Immutable 12 @Getter 13 @ToString 10 14 @Table(name = "ordered_articles_report") 11 15 public class OrderedArticlesReport { … … 19 23 private int quantity; 20 24 private Integer locationid; 21 private intprice;25 private Integer price; 22 26 @Enumerated(EnumType.STRING) 23 27 private ArticleStatus articlestatus; -
FullyStocked/src/main/java/com/bazi/fullystocked/Models/SqlViews/SupplierSuppliesArticleReport.java
r497d129 r7e10599 1 1 package com.bazi.fullystocked.Models.SqlViews; 2 2 3 import lombok.Getter; 3 4 import org.hibernate.annotations.Immutable; 4 5 … … 9 10 @Entity 10 11 @Immutable 12 @Getter 11 13 @Table(name = "supplier_supplies_article") 12 14 public class SupplierSuppliesArticleReport { … … 14 16 private SupplierSuppliesArticleReportId id; 15 17 private String articlename; 18 private String imageurl; 16 19 } -
FullyStocked/src/main/java/com/bazi/fullystocked/Repositories/ArticlesAtLocationRepository.java
r497d129 r7e10599 9 9 public interface ArticlesAtLocationRepository extends JpaRepository<ArticlesAtLocationReport, Integer> { 10 10 List<ArticlesAtLocationReport> findAllByLocationid(Integer id); 11 List<ArticlesAtLocationReport> findAllByArticleid(Integer id); 11 12 } -
FullyStocked/src/main/java/com/bazi/fullystocked/Repositories/OrderedArticlesRepository.java
r497d129 r7e10599 17 17 List<OrderedArticles> findAllByOrder(Orders order); 18 18 Optional<OrderedArticles> findByOrderAndArticle(Orders order, Articles article); 19 Optional<OrderedArticles> findByOrderAndArticleAndLocation(Orders order, Articles article, Locations location); 19 20 List<OrderedArticles> findAllByArticlestatus(ArticleStatus status); 20 21 List<OrderedArticles> findAllByLocationAndArticlestatus(Locations location, ArticleStatus status); -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/ArticlesService.java
r497d129 r7e10599 2 2 3 3 import com.bazi.fullystocked.Models.Articles; 4 import com.bazi.fullystocked.Models.Categories; 5 import com.bazi.fullystocked.Models.SqlViews.ArticlesAtLocationReport; 6 import com.bazi.fullystocked.Models.SqlViews.SupplierSuppliesArticleReport; 7 4 8 import java.util.*; 5 9 … … 8 12 Optional<Articles> create(String description, String articlename, String imageurl, int maxquantityperlocation); 9 13 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 10 18 } -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/ArticlesServiceImpl.java
r497d129 r7e10599 4 4 import com.bazi.fullystocked.Models.Categories; 5 5 import com.bazi.fullystocked.Models.Exceptions.InvalidArgumentsException; 6 import com.bazi.fullystocked.Models.SqlViews.ArticlesAtLocationReport; 7 import com.bazi.fullystocked.Models.SqlViews.SupplierSuppliesArticleReport; 8 import com.bazi.fullystocked.Repositories.ArticlesAtLocationRepository; 6 9 import com.bazi.fullystocked.Repositories.ArticlesRepository; 7 10 import com.bazi.fullystocked.Repositories.CategoriesRepository; 11 import com.bazi.fullystocked.Repositories.SupplierSuppliesArticleRepository; 8 12 import com.bazi.fullystocked.Services.ArticlesService; 9 13 import org.springframework.stereotype.Service; 10 14 11 15 import javax.transaction.Transactional; 16 import java.util.List; 12 17 import java.util.Optional; 13 18 … … 16 21 private final ArticlesRepository articlesRepository; 17 22 private final CategoriesRepository categoriesRepository; 23 private final SupplierSuppliesArticleRepository supplierSuppliesArticleRepository; 24 private final ArticlesAtLocationRepository articlesAtLocationRepository; 18 25 19 public ArticlesServiceImpl(ArticlesRepository articlesRepository, CategoriesRepository categoriesRepository ) {26 public ArticlesServiceImpl(ArticlesRepository articlesRepository, CategoriesRepository categoriesRepository, SupplierSuppliesArticleRepository supplierSuppliesArticleRepository, ArticlesAtLocationRepository articlesAtLocationRepository) { 20 27 this.articlesRepository = articlesRepository; 21 28 this.categoriesRepository = categoriesRepository; 29 this.supplierSuppliesArticleRepository = supplierSuppliesArticleRepository; 30 this.articlesAtLocationRepository = articlesAtLocationRepository; 22 31 } 23 32 … … 49 58 return Optional.of(articles); 50 59 } 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 } 51 76 } -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/LocationServiceImpl.java
r497d129 r7e10599 1 1 package com.bazi.fullystocked.Services.Implementations; 2 2 3 import com.bazi.fullystocked.Models.Locations; 3 4 import com.bazi.fullystocked.Models.SqlViews.ArticlesAtLocationReport; 4 5 import com.bazi.fullystocked.Repositories.ArticlesAtLocationRepository; 6 import com.bazi.fullystocked.Repositories.LocationsRepository; 5 7 import com.bazi.fullystocked.Services.LocationsService; 6 8 import org.springframework.stereotype.Service; … … 11 13 public class LocationServiceImpl implements LocationsService { 12 14 private final ArticlesAtLocationRepository articlesAtLocationRepository; 15 private final LocationsRepository locationsRepository; 13 16 14 public LocationServiceImpl(ArticlesAtLocationRepository articlesAtLocationRepository ) {17 public LocationServiceImpl(ArticlesAtLocationRepository articlesAtLocationRepository, LocationsRepository locationsRepository) { 15 18 this.articlesAtLocationRepository = articlesAtLocationRepository; 19 this.locationsRepository = locationsRepository; 16 20 } 17 21 … … 20 24 return articlesAtLocationRepository.findAllByLocationid(locationid); 21 25 } 26 27 @Override 28 public List<Locations> findAll() { 29 return locationsRepository.findAll(); 30 } 22 31 } -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/OrdersServiceImpl.java
r497d129 r7e10599 8 8 import com.bazi.fullystocked.Models.Exceptions.ArticleMaxQuantityException; 9 9 import com.bazi.fullystocked.Models.Exceptions.InvalidArgumentsException; 10 import com.bazi.fullystocked.Models.SqlViews.OrdersReport; 10 11 import com.bazi.fullystocked.Repositories.*; 11 12 import com.bazi.fullystocked.Services.OrdersService; … … 13 14 14 15 import javax.transaction.Transactional; 16 import java.time.LocalDateTime; 15 17 import java.util.List; 16 18 import java.util.Optional; … … 25 27 private final LocationsRepository locationsRepository; 26 28 private final OrderedArticlesRepository orderedArticlesRepository; 29 private final OrdersReportRepository ordersReportRepository; 27 30 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) { 29 32 this.ordersRepository = ordersRepository; 30 33 this.managersRepository = managersRepository; … … 33 36 this.locationsRepository = locationsRepository; 34 37 this.orderedArticlesRepository = orderedArticlesRepository; 38 this.ordersReportRepository = ordersReportRepository; 35 39 } 36 40 … … 49 53 50 54 @Override 55 public List<OrdersReport> findAllByManagerReport(Integer managerId) { 56 return ordersReportRepository.findAllByManageruserid(managerId); 57 } 58 59 @Override 51 60 public List<Orders> findAllByManagerAndStatus(Integer managerId, OrderStatus status) { 52 61 Managers manager=managersRepository.findById(managerId).orElseThrow(InvalidArgumentsException::new); … … 60 69 Articles article=articlesRepository.findById(articleId).orElseThrow(InvalidArgumentsException::new); 61 70 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()) 63 76 { 64 77 throw new ArticleAlreadyInOrderException(); … … 102 115 103 116 @Override 117 public List<OrdersReport> findAllBySupplierReport(Integer supplierId) { 118 return ordersReportRepository.findAllBySupplieruserid(supplierId); 119 } 120 121 @Override 104 122 public List<Orders> findAllBySupplierAndStatus(Integer supplierId, OrderStatus status) { 105 123 Suppliers supplier=suppliersRepository.findById(supplierId).orElseThrow(InvalidArgumentsException::new); … … 113 131 114 132 @Override 133 public Optional<OrdersReport> findByIdReport(Integer orderId) { 134 return ordersReportRepository.findById(orderId); 135 } 136 137 @Override 115 138 public Optional<Orders> updateStatus(Integer orderId, OrderStatus status) { 116 139 Orders order=ordersRepository.findById(orderId).orElseThrow(InvalidArgumentsException::new); … … 119 142 throw new InvalidArgumentsException(); 120 143 } 121 if(status.equals(OrderStatus. APPROVED) && !order.getStatus().equals(OrderStatus.CREATED))144 if(status.equals(OrderStatus.SENT) && !order.getStatus().equals(OrderStatus.CREATED)) 122 145 { 123 146 throw new InvalidArgumentsException(); 124 147 } 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))) 126 153 { 127 154 throw new InvalidArgumentsException(); … … 157 184 } 158 185 } 186 if(status.equals(OrderStatus.APPROVED)) 187 { 188 order.setDateapproved(LocalDateTime.now()); 189 } 159 190 order.setStatus(status); 160 191 return Optional.of(ordersRepository.save(order)); -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/StoredArticlesServiceImpl.java
r497d129 r7e10599 1 1 package com.bazi.fullystocked.Services.Implementations; 2 2 3 import com.bazi.fullystocked.Models.Categories; 3 4 import com.bazi.fullystocked.Models.Enumerations.ArticleStatus; 4 5 import com.bazi.fullystocked.Models.Enumerations.OrderStatus; … … 22 23 @Service 23 24 public class StoredArticlesServiceImpl implements StoredArticlesService { 24 private final SupplierSuppliesArticleRepository supplierSuppliesArticleRepository;25 25 private final OrderedArticlesRepository orderedArticlesRepository; 26 26 private final StoredArticlesRepository storedArticlesRepository; … … 28 28 private final ArticlesReportRepository articlesReportRepository; 29 29 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) { 32 31 this.orderedArticlesRepository = orderedArticlesRepository; 33 32 this.storedArticlesRepository = storedArticlesRepository; … … 36 35 } 37 36 38 @Override39 public List<SupplierSuppliesArticleReport> findAllBySupplier(Integer supplierId) {40 return supplierSuppliesArticleRepository.findAllById_Userid(supplierId);41 }42 37 43 38 @Override -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/Implementations/SuppliersServiceImpl.java
r497d129 r7e10599 1 1 package com.bazi.fullystocked.Services.Implementations; 2 2 3 import com.bazi.fullystocked.Models.SqlViews.SuppliersReport; 3 4 import com.bazi.fullystocked.Models.Suppliers; 5 import com.bazi.fullystocked.Repositories.SuppliersReportRepository; 4 6 import com.bazi.fullystocked.Repositories.SuppliersRepository; 5 7 import com.bazi.fullystocked.Services.SuppliersService; … … 7 9 8 10 import java.util.List; 11 import java.util.Optional; 9 12 10 13 @Service 11 14 public class SuppliersServiceImpl implements SuppliersService { 12 15 private final SuppliersRepository suppliersRepository; 16 private final SuppliersReportRepository suppliersReportRepository; 13 17 14 public SuppliersServiceImpl(SuppliersRepository suppliersRepository ) {18 public SuppliersServiceImpl(SuppliersRepository suppliersRepository, SuppliersReportRepository suppliersReportRepository) { 15 19 this.suppliersRepository = suppliersRepository; 20 this.suppliersReportRepository = suppliersReportRepository; 16 21 } 17 22 … … 20 25 return suppliersRepository.findAll(); 21 26 } 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 } 22 42 } -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/LocationsService.java
r497d129 r7e10599 2 2 3 3 4 import com.bazi.fullystocked.Models.Locations; 4 5 import com.bazi.fullystocked.Models.SqlViews.ArticlesAtLocationReport; 5 6 … … 8 9 public interface LocationsService { 9 10 List<ArticlesAtLocationReport> findAllArticlesAtLocation(Integer locationid); 11 List<Locations> findAll(); 10 12 } -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/OrdersService.java
r497d129 r7e10599 4 4 import com.bazi.fullystocked.Models.Enumerations.OrderStatus; 5 5 import com.bazi.fullystocked.Models.Orders; 6 import com.bazi.fullystocked.Models.SqlViews.OrdersReport; 7 import com.bazi.fullystocked.Repositories.OrdersReportRepository; 8 6 9 import java.util.*; 7 10 … … 9 12 Optional<Orders> create(OrderPriority priority, Integer managerId, Integer supplierId); 10 13 List<Orders> findAllByManager(Integer managerId); 14 List<OrdersReport> findAllByManagerReport(Integer managerId); 11 15 List<Orders> findAllByManagerAndStatus(Integer managerId, OrderStatus status); 12 16 Optional<Orders> addArticleToOrder(int quantity, Integer locationId, Integer articleId, Integer orderId); … … 14 18 Optional<Orders> addSupplierRemark(Integer orderId, String remark); 15 19 List<Orders> findAllBySupplier(Integer supplierId); 20 List<OrdersReport> findAllBySupplierReport(Integer supplierId); 16 21 List<Orders> findAllBySupplierAndStatus(Integer supplierId, OrderStatus status); 17 22 Optional<Orders> findById(Integer orderId); 23 Optional<OrdersReport> findByIdReport(Integer orderId); 18 24 Optional<Orders> updateStatus(Integer orderId, OrderStatus status); 19 25 -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/StoredArticlesService.java
r497d129 r7e10599 2 2 3 3 4 import com.bazi.fullystocked.Models.Categories; 4 5 import com.bazi.fullystocked.Models.SqlViews.ArticlesReport; 5 6 import com.bazi.fullystocked.Models.SqlViews.SupplierSuppliesArticleReport; … … 9 10 10 11 public interface StoredArticlesService { 11 List<SupplierSuppliesArticleReport> findAllBySupplier(Integer supplierId);12 12 Optional<StoredArticles> updateFromOrder(Integer oarticleid); 13 13 List<ArticlesReport> findByLocation(Integer locationId); -
FullyStocked/src/main/java/com/bazi/fullystocked/Services/SuppliersService.java
r497d129 r7e10599 1 1 package com.bazi.fullystocked.Services; 2 2 3 import com.bazi.fullystocked.Models.SqlViews.SuppliersReport; 3 4 import com.bazi.fullystocked.Models.Suppliers; 4 5 … … 7 8 public interface SuppliersService { 8 9 List<Suppliers> findAll(); 10 Optional<SuppliersReport> findByIdReport(Integer id); 11 List<SuppliersReport> findAllSuppliersReport(); 12 Optional<Suppliers> findById(Integer id); 9 13 } -
FullyStocked/src/main/java/com/bazi/fullystocked/Web/Controller/InvoiceController.java
r497d129 r7e10599 64 64 if(invoicesService.findById(invoiceId).isEmpty()) 65 65 { 66 return "redirect:/ create";66 return "redirect:/invoices/create"; 67 67 } 68 68 try{ -
FullyStocked/src/main/java/com/bazi/fullystocked/Web/Controller/WorkerController.java
r497d129 r7e10599 2 2 3 3 import com.bazi.fullystocked.Models.SqlViews.ArticlesReport; 4 import com.bazi.fullystocked.Models.StoredArticles;5 import com.bazi.fullystocked.Models.User;6 4 import com.bazi.fullystocked.Models.Workers; 5 import com.bazi.fullystocked.Services.ArticlesService; 7 6 import com.bazi.fullystocked.Services.StoredArticlesService; 8 7 import org.springframework.stereotype.Controller; … … 14 13 import javax.servlet.http.HttpServletRequest; 15 14 import java.util.List; 16 import java.util.Optional;17 15 18 16 @Controller … … 20 18 public class WorkerController { 21 19 private final StoredArticlesService storedArticlesService; 20 private final ArticlesService articlesService; 22 21 23 public WorkerController(StoredArticlesService storedArticlesService ) {22 public WorkerController(StoredArticlesService storedArticlesService, ArticlesService articlesService) { 24 23 this.storedArticlesService = storedArticlesService; 24 this.articlesService = articlesService; 25 25 } 26 26 … … 46 46 ArticlesReport articlesReport=this.storedArticlesService.findById(id).get(); 47 47 model.addAttribute("article",articlesReport); 48 model.addAttribute("categories", articlesService.findAllCategoriesByArticle(articlesReport.getArticleid())); 48 49 return "detailsArticle"; 49 50 } -
FullyStocked/src/main/resources/templates/addInvoiceArticle.html
r497d129 r7e10599 64 64 <span class="input-group-text inputGroup-sizing-sm">Количина</span> 65 65 </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"> 67 67 </div> 68 68 <div class="input-group input-group-sm mb-3"> … … 70 70 <span class="input-group-text inputGroup-sizing-sm">Цена</span> 71 71 </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"> 73 73 </div> 74 74 <input type="hidden" name="invoiceId" th:value="${invId}"> -
FullyStocked/src/main/resources/templates/detailsArticle.html
r497d129 r7e10599 57 57 </div><!-- / project-info-box --> 58 58 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 59 68 <div class="project-info-box mt-0 mb-0"> 60 69 <p class="mb-0">
Note:
See TracChangeset
for help on using the changeset viewer.