mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2026-02-23 02:02:29 +01:00
Compare commits
54 Commits
copilot/de
...
copilot/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c84911b7ea | ||
|
|
3fc0d95b18 | ||
|
|
a3d992a016 | ||
|
|
6402cfe619 | ||
|
|
ea71fcd120 | ||
|
|
82e3e31277 | ||
|
|
0d4f935b43 | ||
|
|
0205dd523b | ||
|
|
0a8199d81f | ||
|
|
3f6a6cc767 | ||
|
|
33a3dc6203 | ||
|
|
1cd0b459be | ||
|
|
6828ce5803 | ||
|
|
644a44e8e9 | ||
|
|
6c3e4d7880 | ||
|
|
aefb69c51e | ||
|
|
300ee33be2 | ||
|
|
64efca4786 | ||
|
|
ddbfc87ce1 | ||
|
|
3454fa51de | ||
|
|
343ad6beff | ||
|
|
d385303a52 | ||
|
|
00b35e3306 | ||
|
|
e0a25009d9 | ||
|
|
3f0e4b09ce | ||
|
|
96a37a0cb0 | ||
|
|
2157916e9b | ||
|
|
be35c36c58 | ||
|
|
7116c2ceb9 | ||
|
|
c1d4ce77db | ||
|
|
bba3bd90a9 | ||
|
|
eaaf3ac75c | ||
|
|
8957e55a9e | ||
|
|
a232671302 | ||
|
|
5a53423594 | ||
|
|
390206f529 | ||
|
|
74862c7bb8 | ||
|
|
0e61a84ea6 | ||
|
|
3e380f82d2 | ||
|
|
a5d7a5f1d3 | ||
|
|
876cfc0375 | ||
|
|
641c8388c1 | ||
|
|
2f580c92d1 | ||
|
|
6fcdc0b0c3 | ||
|
|
225e347c24 | ||
|
|
fb805e2e0a | ||
|
|
8548237522 | ||
|
|
77819af9a8 | ||
|
|
68217f50c4 | ||
|
|
d42f728fad | ||
|
|
b1210bc3b5 | ||
|
|
045362de0e | ||
|
|
6a5039326c | ||
|
|
bee1542cce |
8
.github/workflows/assets_artifact_build.yml
vendored
8
.github/workflows/assets_artifact_build.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
||||
run: |
|
||||
echo "::set-output name=dir::$(composer config cache-files-dir)"
|
||||
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
id: yarn-cache-dir-path
|
||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v5
|
||||
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
|
||||
with:
|
||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||
@@ -80,13 +80,13 @@ jobs:
|
||||
run: zip -r /tmp/partdb_assets.zip public/build/ vendor/
|
||||
|
||||
- name: Upload assets artifact
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: Only dependencies and built assets
|
||||
path: /tmp/partdb_assets.zip
|
||||
|
||||
- name: Upload full artifact
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: Full Part-DB including dependencies and built assets
|
||||
path: /tmp/partdb_with_assets.zip
|
||||
|
||||
2
.github/workflows/static_analysis.yml
vendored
2
.github/workflows/static_analysis.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
||||
run: |
|
||||
echo "::set-output name=dir::$(composer config cache-files-dir)"
|
||||
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
||||
|
||||
4
.github/workflows/tests.yml
vendored
4
.github/workflows/tests.yml
vendored
@@ -81,7 +81,7 @@ jobs:
|
||||
id: composer-cache
|
||||
run: |
|
||||
echo "::set-output name=dir::$(composer config cache-files-dir)"
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
||||
@@ -92,7 +92,7 @@ jobs:
|
||||
id: yarn-cache-dir-path
|
||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v5
|
||||
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
|
||||
with:
|
||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||
|
||||
@@ -1,193 +0,0 @@
|
||||
# Entity Inheritance Hierarchy Decomposition
|
||||
|
||||
## Overview
|
||||
|
||||
This refactoring decomposes the deep entity inheritance hierarchy into a more flexible trait-based architecture. This provides better code reusability, composition, and maintainability.
|
||||
|
||||
## Architecture Diagram
|
||||
|
||||
### Before (Deep Inheritance):
|
||||
```
|
||||
AbstractDBElement (ID logic)
|
||||
└─ AbstractNamedDBElement (name + timestamps)
|
||||
└─ AttachmentContainingDBElement (attachments)
|
||||
└─ AbstractStructuralDBElement (tree/hierarchy + parameters)
|
||||
├─ AbstractPartsContainingDBElement
|
||||
│ ├─ Category
|
||||
│ ├─ Footprint
|
||||
│ ├─ StorageLocation
|
||||
│ └─ AbstractCompany (company fields)
|
||||
│ ├─ Manufacturer
|
||||
│ └─ Supplier
|
||||
```
|
||||
|
||||
### After (Trait Composition):
|
||||
```
|
||||
Traits: Interfaces:
|
||||
- DBElementTrait - DBElementInterface
|
||||
- NamedElementTrait - NamedElementInterface
|
||||
- TimestampTrait - TimeStampableInterface
|
||||
- AttachmentsTrait - HasAttachmentsInterface
|
||||
- MasterAttachmentTrait - HasMasterAttachmentInterface
|
||||
- StructuralElementTrait - StructuralElementInterface
|
||||
- ParametersTrait - HasParametersInterface
|
||||
- CompanyTrait - CompanyInterface
|
||||
|
||||
Class Hierarchy (now uses traits):
|
||||
AbstractDBElement (uses DBElementTrait, implements DBElementInterface)
|
||||
└─ AbstractNamedDBElement (uses NamedElementTrait + TimestampTrait)
|
||||
└─ AttachmentContainingDBElement (uses AttachmentsTrait + MasterAttachmentTrait)
|
||||
└─ AbstractStructuralDBElement (uses StructuralElementTrait + ParametersTrait)
|
||||
├─ AbstractPartsContainingDBElement
|
||||
│ ├─ Category (gets all traits via inheritance)
|
||||
│ ├─ Footprint (gets all traits via inheritance)
|
||||
│ └─ AbstractCompany (uses CompanyTrait)
|
||||
│ ├─ Manufacturer
|
||||
│ └─ Supplier
|
||||
```
|
||||
|
||||
## Changes Made
|
||||
|
||||
### New Traits Created
|
||||
|
||||
1. **DBElementTrait** (`src/Entity/Base/DBElementTrait.php`)
|
||||
- Provides basic database element functionality with an ID
|
||||
- Includes `getID()` method and clone helper
|
||||
- Extracted from `AbstractDBElement`
|
||||
|
||||
2. **NamedElementTrait** (`src/Entity/Base/NamedElementTrait.php`)
|
||||
- Provides named element functionality (name property and methods)
|
||||
- Includes `getName()`, `setName()`, and `__toString()` methods
|
||||
- Extracted from `AbstractNamedDBElement`
|
||||
|
||||
3. **AttachmentsTrait** (`src/Entity/Base/AttachmentsTrait.php`)
|
||||
- Provides attachments collection functionality
|
||||
- Includes methods for adding, removing, and getting attachments
|
||||
- Includes clone helper for deep cloning attachments
|
||||
- Extracted from `AttachmentContainingDBElement`
|
||||
|
||||
4. **StructuralElementTrait** (`src/Entity/Base/StructuralElementTrait.php`)
|
||||
- Provides tree/hierarchy functionality for structural elements
|
||||
- Includes parent/child relationships, path calculations, level tracking
|
||||
- Includes methods like `isRoot()`, `isChildOf()`, `getFullPath()`, etc.
|
||||
- Extracted from `AbstractStructuralDBElement`
|
||||
|
||||
5. **CompanyTrait** (`src/Entity/Base/CompanyTrait.php`)
|
||||
- Provides company-specific fields (address, phone, email, website, etc.)
|
||||
- Includes getters and setters for all company fields
|
||||
- Extracted from `AbstractCompany`
|
||||
|
||||
### New Interfaces Created
|
||||
|
||||
1. **DBElementInterface** (`src/Entity/Contracts/DBElementInterface.php`)
|
||||
- Interface for entities with a database ID
|
||||
- Defines `getID()` method
|
||||
|
||||
2. **StructuralElementInterface** (`src/Entity/Contracts/StructuralElementInterface.php`)
|
||||
- Interface for structural/hierarchical elements
|
||||
- Defines methods for tree navigation and hierarchy
|
||||
|
||||
3. **CompanyInterface** (`src/Entity/Contracts/CompanyInterface.php`)
|
||||
- Interface for company entities
|
||||
- Defines basic company information accessors
|
||||
|
||||
4. **HasParametersInterface** (`src/Entity/Contracts/HasParametersInterface.php`)
|
||||
- Interface for entities that have parameters
|
||||
- Defines `getParameters()` method
|
||||
|
||||
### Refactored Classes
|
||||
|
||||
1. **AbstractDBElement**
|
||||
- Now uses `DBElementTrait`
|
||||
- Implements `DBElementInterface`
|
||||
- Simplified to just use the trait instead of duplicating code
|
||||
|
||||
2. **AbstractNamedDBElement**
|
||||
- Now uses `NamedElementTrait` in addition to existing `TimestampTrait`
|
||||
- Cleaner implementation with trait composition
|
||||
|
||||
3. **AttachmentContainingDBElement**
|
||||
- Now uses `AttachmentsTrait` and `MasterAttachmentTrait`
|
||||
- Simplified constructor and clone methods
|
||||
|
||||
4. **AbstractStructuralDBElement**
|
||||
- Now uses `StructuralElementTrait` and `ParametersTrait`
|
||||
- Implements `StructuralElementInterface` and `HasParametersInterface`
|
||||
- Much cleaner with most functionality extracted to trait
|
||||
|
||||
5. **AbstractCompany**
|
||||
- Now uses `CompanyTrait`
|
||||
- Implements `CompanyInterface`
|
||||
- Significantly simplified from ~260 lines to ~20 lines
|
||||
|
||||
## Benefits
|
||||
|
||||
### 1. **Better Code Reusability**
|
||||
- Traits can be reused in different contexts without requiring inheritance
|
||||
- Easier to mix and match functionality
|
||||
|
||||
### 2. **Improved Maintainability**
|
||||
- Each trait focuses on a single concern (SRP - Single Responsibility Principle)
|
||||
- Easier to locate and modify specific functionality
|
||||
- Reduced code duplication
|
||||
|
||||
### 3. **More Flexible Architecture**
|
||||
- Entities can now compose functionality as needed
|
||||
- Not locked into a rigid inheritance hierarchy
|
||||
- Easier to add new functionality without modifying base classes
|
||||
|
||||
### 4. **Better Testability**
|
||||
- Traits can be tested independently
|
||||
- Easier to mock specific functionality
|
||||
|
||||
### 5. **Clearer Contracts**
|
||||
- Interfaces make dependencies explicit
|
||||
- Better IDE support and type hinting
|
||||
|
||||
## Migration Path
|
||||
|
||||
This refactoring is backward compatible - all existing entities continue to work as before. The changes are internal to the base classes and do not affect the public API.
|
||||
|
||||
### For New Entities
|
||||
|
||||
New entities can now:
|
||||
1. Use traits directly without deep inheritance
|
||||
2. Mix and match functionality as needed
|
||||
3. Implement only the interfaces they need
|
||||
|
||||
Example:
|
||||
```php
|
||||
class MyCustomEntity extends AbstractDBElement implements NamedElementInterface
|
||||
{
|
||||
use NamedElementTrait;
|
||||
|
||||
// Custom functionality
|
||||
}
|
||||
```
|
||||
|
||||
## Technical Details
|
||||
|
||||
### Trait Usage Pattern
|
||||
|
||||
All traits follow this pattern:
|
||||
1. Declare properties with appropriate Doctrine/validation annotations
|
||||
2. Provide initialization methods (e.g., `initializeAttachments()`)
|
||||
3. Provide business logic methods
|
||||
4. Provide clone helpers for deep cloning when needed
|
||||
|
||||
### Interface Contracts
|
||||
|
||||
All interfaces define the minimal contract required for that functionality:
|
||||
- DBElementInterface: requires `getID()`
|
||||
- NamedElementInterface: requires `getName()`
|
||||
- StructuralElementInterface: requires hierarchy methods
|
||||
- CompanyInterface: requires company info accessors
|
||||
- HasParametersInterface: requires `getParameters()`
|
||||
|
||||
## Future Improvements
|
||||
|
||||
Potential future enhancements:
|
||||
1. Extract more functionality from remaining abstract classes
|
||||
2. Create more granular traits for specific features
|
||||
3. Add trait-specific unit tests
|
||||
4. Consider creating trait-based mixins for common entity patterns
|
||||
@@ -1,141 +0,0 @@
|
||||
# Entity Inheritance Hierarchy Refactoring - Implementation Summary
|
||||
|
||||
## Task Completed
|
||||
Successfully decomposed the deep entity inheritance hierarchy into traits and interfaces for better architecture.
|
||||
|
||||
## Changes Overview
|
||||
|
||||
### Files Modified (5)
|
||||
1. `src/Entity/Base/AbstractDBElement.php` - Now uses DBElementTrait
|
||||
2. `src/Entity/Base/AbstractNamedDBElement.php` - Now uses NamedElementTrait
|
||||
3. `src/Entity/Attachments/AttachmentContainingDBElement.php` - Now uses AttachmentsTrait
|
||||
4. `src/Entity/Base/AbstractStructuralDBElement.php` - Now uses StructuralElementTrait
|
||||
5. `src/Entity/Base/AbstractCompany.php` - Now uses CompanyTrait
|
||||
|
||||
### New Traits Created (5)
|
||||
1. `src/Entity/Base/DBElementTrait.php` - ID management functionality
|
||||
2. `src/Entity/Base/NamedElementTrait.php` - Name property and methods
|
||||
3. `src/Entity/Base/AttachmentsTrait.php` - Attachment collection management
|
||||
4. `src/Entity/Base/StructuralElementTrait.php` - Tree/hierarchy functionality
|
||||
5. `src/Entity/Base/CompanyTrait.php` - Company-specific fields
|
||||
|
||||
### New Interfaces Created (4)
|
||||
1. `src/Entity/Contracts/DBElementInterface.php` - Contract for DB entities
|
||||
2. `src/Entity/Contracts/StructuralElementInterface.php` - Contract for hierarchical entities
|
||||
3. `src/Entity/Contracts/CompanyInterface.php` - Contract for company entities
|
||||
4. `src/Entity/Contracts/HasParametersInterface.php` - Contract for parametrized entities
|
||||
|
||||
### Documentation Added (2)
|
||||
1. `ENTITY_REFACTORING.md` - Comprehensive documentation with architecture diagrams
|
||||
2. `IMPLEMENTATION_SUMMARY.md` - This file
|
||||
|
||||
## Impact Analysis
|
||||
|
||||
### Code Metrics
|
||||
- **Lines Added**: 1,291 (traits, interfaces, documentation)
|
||||
- **Lines Removed**: 740 (from base classes)
|
||||
- **Net Change**: +551 lines
|
||||
- **Code Reduction in Base Classes**: ~1000 lines moved to reusable traits
|
||||
|
||||
### Affected Classes
|
||||
All entities that extend from the modified base classes now benefit from the trait-based architecture:
|
||||
- Category, Footprint, StorageLocation, MeasurementUnit, PartCustomState
|
||||
- Manufacturer, Supplier
|
||||
- And all other entities in the inheritance chain
|
||||
|
||||
### Breaking Changes
|
||||
**None** - This is a backward-compatible refactoring. All public APIs remain unchanged.
|
||||
|
||||
## Benefits Achieved
|
||||
|
||||
### 1. Improved Code Reusability
|
||||
- Traits can be mixed and matched in different combinations
|
||||
- No longer locked into rigid inheritance hierarchy
|
||||
- Easier to create new entity types with specific functionality
|
||||
|
||||
### 2. Better Maintainability
|
||||
- Each trait has a single, well-defined responsibility
|
||||
- Easier to locate and modify specific functionality
|
||||
- Reduced code duplication across the codebase
|
||||
|
||||
### 3. Enhanced Flexibility
|
||||
- Future entities can compose functionality as needed
|
||||
- Can add new traits without modifying existing class hierarchy
|
||||
- Supports multiple inheritance patterns via trait composition
|
||||
|
||||
### 4. Clearer Contracts
|
||||
- Interfaces make dependencies and capabilities explicit
|
||||
- Better IDE support and auto-completion
|
||||
- Improved static analysis capabilities
|
||||
|
||||
### 5. Preserved Backward Compatibility
|
||||
- All existing entities continue to work unchanged
|
||||
- No modifications required to controllers, services, or repositories
|
||||
- Database schema remains the same
|
||||
|
||||
## Testing Notes
|
||||
|
||||
### Validation Performed
|
||||
- ✅ PHP syntax validation on all modified files
|
||||
- ✅ Verified all traits can be loaded
|
||||
- ✅ Code review feedback addressed
|
||||
- ✅ Documentation completeness checked
|
||||
|
||||
### Recommended Testing
|
||||
Before merging, the following tests should be run:
|
||||
1. Full PHPUnit test suite
|
||||
2. Static analysis (PHPStan level 5)
|
||||
3. Integration tests for entities
|
||||
4. Database migration tests
|
||||
|
||||
## Code Review Feedback Addressed
|
||||
|
||||
All code review comments were addressed:
|
||||
1. ✅ Fixed typo: "addres" → "address"
|
||||
2. ✅ Removed unnecessary comma in docstrings
|
||||
3. ✅ Fixed nullable return type documentation
|
||||
4. ✅ Fixed inconsistent nullable string initialization
|
||||
5. ✅ Replaced isset() with direct null comparison
|
||||
6. ✅ Documented trait dependencies (MasterAttachmentTrait)
|
||||
7. ✅ Fixed grammar: "a most top element" → "the topmost element"
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
Potential improvements for future iterations:
|
||||
1. Extract more granular traits for specific features
|
||||
2. Create trait-specific unit tests
|
||||
3. Consider extracting validation logic into traits
|
||||
4. Add more interfaces for fine-grained contracts
|
||||
5. Create documentation for custom entity development
|
||||
|
||||
## Migration Guide for Developers
|
||||
|
||||
### Using Traits in New Entities
|
||||
|
||||
```php
|
||||
// Example: Creating a new entity with specific traits
|
||||
use App\Entity\Base\DBElementTrait;
|
||||
use App\Entity\Base\NamedElementTrait;
|
||||
use App\Entity\Contracts\DBElementInterface;
|
||||
use App\Entity\Contracts\NamedElementInterface;
|
||||
|
||||
class MyEntity implements DBElementInterface, NamedElementInterface
|
||||
{
|
||||
use DBElementTrait;
|
||||
use NamedElementTrait;
|
||||
|
||||
// Custom functionality here
|
||||
}
|
||||
```
|
||||
|
||||
### Trait Dependencies
|
||||
|
||||
Some traits have dependencies on other traits or methods:
|
||||
- **StructuralElementTrait** requires `getName()` and `getID()` methods
|
||||
- **AttachmentsTrait** works best with `MasterAttachmentTrait`
|
||||
|
||||
Refer to trait documentation for specific requirements.
|
||||
|
||||
## Conclusion
|
||||
|
||||
This refactoring successfully modernizes the entity architecture while maintaining full backward compatibility. The trait-based approach provides better code organization, reusability, and maintainability for the Part-DB project.
|
||||
@@ -26,9 +26,6 @@ import {marked} from "marked";
|
||||
|
||||
import {
|
||||
trans,
|
||||
SEARCH_PLACEHOLDER,
|
||||
SEARCH_SUBMIT,
|
||||
STATISTICS_PARTS
|
||||
} from '../../translator';
|
||||
|
||||
|
||||
@@ -82,9 +79,9 @@ export default class extends Controller {
|
||||
panelPlacement: this.element.dataset.panelPlacement,
|
||||
plugins: [recentSearchesPlugin],
|
||||
openOnFocus: true,
|
||||
placeholder: trans(SEARCH_PLACEHOLDER),
|
||||
placeholder: trans("search.placeholder"),
|
||||
translations: {
|
||||
submitButtonTitle: trans(SEARCH_SUBMIT)
|
||||
submitButtonTitle: trans("search.submit")
|
||||
},
|
||||
|
||||
// Use a navigator compatible with turbo:
|
||||
@@ -153,7 +150,7 @@ export default class extends Controller {
|
||||
},
|
||||
templates: {
|
||||
header({ html }) {
|
||||
return html`<span class="aa-SourceHeaderTitle">${trans(STATISTICS_PARTS)}</span>
|
||||
return html`<span class="aa-SourceHeaderTitle">${trans("part.labelp")}</span>
|
||||
<div class="aa-SourceHeaderLine" />`;
|
||||
},
|
||||
item({item, components, html}) {
|
||||
@@ -197,4 +194,4 @@ export default class extends Controller {
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,8 +25,7 @@ import * as zxcvbnEnPackage from '@zxcvbn-ts/language-en';
|
||||
import * as zxcvbnDePackage from '@zxcvbn-ts/language-de';
|
||||
import * as zxcvbnFrPackage from '@zxcvbn-ts/language-fr';
|
||||
import * as zxcvbnJaPackage from '@zxcvbn-ts/language-ja';
|
||||
import {trans, USER_PASSWORD_STRENGTH_VERY_WEAK, USER_PASSWORD_STRENGTH_WEAK, USER_PASSWORD_STRENGTH_MEDIUM,
|
||||
USER_PASSWORD_STRENGTH_STRONG, USER_PASSWORD_STRENGTH_VERY_STRONG} from '../../translator.js';
|
||||
import {trans} from '../../translator.js';
|
||||
|
||||
/* stimulusFetch: 'lazy' */
|
||||
export default class extends Controller {
|
||||
@@ -89,23 +88,23 @@ export default class extends Controller {
|
||||
|
||||
switch (level) {
|
||||
case 0:
|
||||
text = trans(USER_PASSWORD_STRENGTH_VERY_WEAK);
|
||||
text = trans("user.password_strength.very_weak");
|
||||
classes = "bg-danger badge-danger";
|
||||
break;
|
||||
case 1:
|
||||
text = trans(USER_PASSWORD_STRENGTH_WEAK);
|
||||
text = trans("user.password_strength.weak");
|
||||
classes = "bg-warning badge-warning";
|
||||
break;
|
||||
case 2:
|
||||
text = trans(USER_PASSWORD_STRENGTH_MEDIUM)
|
||||
text = trans("user.password_strength.medium");
|
||||
classes = "bg-info badge-info";
|
||||
break;
|
||||
case 3:
|
||||
text = trans(USER_PASSWORD_STRENGTH_STRONG);
|
||||
text = trans("user.password_strength.strong");
|
||||
classes = "bg-primary badge-primary";
|
||||
break;
|
||||
case 4:
|
||||
text = trans(USER_PASSWORD_STRENGTH_VERY_STRONG);
|
||||
text = trans("user.password_strength.very_strong");
|
||||
classes = "bg-success badge-success";
|
||||
break;
|
||||
default:
|
||||
@@ -120,4 +119,4 @@ export default class extends Controller {
|
||||
this.badgeTarget.classList.add("badge");
|
||||
this.badgeTarget.classList.add(...classes.split(" "));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ import '../../css/components/tom-select_extensions.css';
|
||||
import TomSelect from "tom-select";
|
||||
import {Controller} from "@hotwired/stimulus";
|
||||
|
||||
import {trans, ENTITY_SELECT_GROUP_NEW_NOT_ADDED_TO_DB} from '../../translator.js'
|
||||
import {trans} from '../../translator.js'
|
||||
|
||||
import TomSelect_autoselect_typed from '../../tomselect/autoselect_typed/autoselect_typed'
|
||||
TomSelect.define('autoselect_typed', TomSelect_autoselect_typed)
|
||||
@@ -204,7 +204,7 @@ export default class extends Controller {
|
||||
|
||||
if (data.not_in_db_yet) {
|
||||
//Not yet added items are shown italic and with a badge
|
||||
name += "<i><b>" + escape(data.text) + "</b></i>" + "<span class='ms-3 badge bg-info badge-info'>" + trans(ENTITY_SELECT_GROUP_NEW_NOT_ADDED_TO_DB) + "</span>";
|
||||
name += "<i><b>" + escape(data.text) + "</b></i>" + "<span class='ms-3 badge bg-info badge-info'>" + trans("entity.select.group.new_not_added_to_DB") + "</span>";
|
||||
} else {
|
||||
name += "<b>" + escape(data.text) + "</b>";
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ import "./register_events";
|
||||
import "./tristate_checkboxes";
|
||||
|
||||
//Define jquery globally
|
||||
window.$ = window.jQuery = require("jquery");
|
||||
global.$ = global.jQuery = require("jquery");
|
||||
|
||||
//Use the local WASM file for the ZXing library
|
||||
import {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { localeFallbacks } from '../var/translations/configuration';
|
||||
import { trans, getLocale, setLocale, setLocaleFallbacks } from '@symfony/ux-translator';
|
||||
import { createTranslator } from '@symfony/ux-translator';
|
||||
import { messages, localeFallbacks } from '../var/translations/index.js';
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony UX Translator package.
|
||||
*
|
||||
@@ -9,8 +10,12 @@ import { trans, getLocale, setLocale, setLocaleFallbacks } from '@symfony/ux-tra
|
||||
* If you use TypeScript, you can rename this file to "translator.ts" to take advantage of types checking.
|
||||
*/
|
||||
|
||||
setLocaleFallbacks(localeFallbacks);
|
||||
const translator = createTranslator({
|
||||
messages,
|
||||
localeFallbacks,
|
||||
});
|
||||
|
||||
export { trans };
|
||||
|
||||
export * from '../var/translations';
|
||||
// Wrapper function with default domain set to 'frontend'
|
||||
export const trans = (id, parameters = {}, domain = 'frontend', locale = null) => {
|
||||
return translator.trans(id, parameters, domain, locale);
|
||||
};
|
||||
|
||||
@@ -79,7 +79,8 @@
|
||||
"symfony/string": "7.4.*",
|
||||
"symfony/translation": "7.4.*",
|
||||
"symfony/twig-bundle": "7.4.*",
|
||||
"symfony/ux-translator": "^2.10",
|
||||
"symfony/type-info": "7.4.0",
|
||||
"symfony/ux-translator": "^2.32.0",
|
||||
"symfony/ux-turbo": "^2.0",
|
||||
"symfony/validator": "7.4.*",
|
||||
"symfony/web-link": "7.4.*",
|
||||
|
||||
677
composer.lock
generated
677
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -35,4 +35,4 @@ knpu_oauth2_client:
|
||||
provider_options:
|
||||
urlAuthorize: 'https://identity.nexar.com/connect/authorize'
|
||||
urlAccessToken: 'https://identity.nexar.com/connect/token'
|
||||
urlResourceOwnerDetails: ''
|
||||
urlResourceOwnerDetails: ''
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
ux_translator:
|
||||
# The directory where the JavaScript translations are dumped
|
||||
dump_directory: '%kernel.project_dir%/var/translations'
|
||||
# Only include the frontend translation domain in the JavaScript bundle
|
||||
domains:
|
||||
- 'frontend'
|
||||
|
||||
when@prod:
|
||||
ux_translator:
|
||||
# Control whether TypeScript types are dumped alongside translations.
|
||||
# Disable this if you do not use TypeScript (e.g. in production when using AssetMapper), to speed up cache warmup.
|
||||
# dump_typescript: false
|
||||
|
||||
@@ -1622,6 +1622,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
|
||||
* flysystem?: array{
|
||||
* filesystem_service: scalar|null|Param,
|
||||
* },
|
||||
* asset_mapper?: array<mixed>,
|
||||
* chain?: array{
|
||||
* loaders: list<scalar|null|Param>,
|
||||
* },
|
||||
@@ -2039,6 +2040,16 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
|
||||
* xr_spatial_tracking?: mixed, // Default: null
|
||||
* },
|
||||
* },
|
||||
* cross_origin_isolation?: bool|array{
|
||||
* enabled?: bool|Param, // Default: false
|
||||
* paths?: array<string, array{ // Default: []
|
||||
* coep?: "unsafe-none"|"require-corp"|"credentialless"|Param, // Cross-Origin-Embedder-Policy (COEP) header value
|
||||
* coop?: "unsafe-none"|"same-origin-allow-popups"|"same-origin"|"noopener-allow-popups"|Param, // Cross-Origin-Opener-Policy (COOP) header value
|
||||
* corp?: "same-site"|"same-origin"|"cross-origin"|Param, // Cross-Origin-Resource-Policy (CORP) header value
|
||||
* report_only?: bool|Param, // Use Report-Only headers instead of enforcing (applies to COEP and COOP only) // Default: false
|
||||
* report_to?: scalar|null|Param, // Reporting endpoint name for violations (requires Reporting API configuration, applies to COEP and COOP only) // Default: null
|
||||
* }>,
|
||||
* },
|
||||
* }
|
||||
* @psalm-type TurboConfig = array{
|
||||
* broadcast?: bool|array{
|
||||
@@ -2301,11 +2312,13 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
|
||||
* controllers_json?: scalar|null|Param, // Default: "%kernel.project_dir%/assets/controllers.json"
|
||||
* }
|
||||
* @psalm-type UxTranslatorConfig = array{
|
||||
* dump_directory?: scalar|null|Param, // Default: "%kernel.project_dir%/var/translations"
|
||||
* dump_directory?: scalar|null|Param, // The directory where translations and TypeScript types are dumped. // Default: "%kernel.project_dir%/var/translations"
|
||||
* dump_typescript?: bool|Param, // Control whether TypeScript types are dumped alongside translations. Disable this if you do not use TypeScript (e.g. in production when using AssetMapper). // Default: true
|
||||
* domains?: string|array{ // List of domains to include/exclude from the generated translations. Prefix with a `!` to exclude a domain.
|
||||
* type?: scalar|null|Param,
|
||||
* elements?: list<scalar|null|Param>,
|
||||
* },
|
||||
* keys_patterns?: list<scalar|null|Param>,
|
||||
* }
|
||||
* @psalm-type DompdfFontLoaderConfig = array{
|
||||
* autodiscovery?: bool|array{
|
||||
|
||||
@@ -21,8 +21,8 @@ differences between them, which might be important for you. Therefore the pros a
|
||||
are listed here.
|
||||
|
||||
{: .important }
|
||||
You have to choose between the database types before you start using Part-DB and **you can not change it (easily) after
|
||||
you have started creating data**. So you should choose the database type for your use case (and possible future uses).
|
||||
While you can change the database platform later (see below), it is still experimental and not recommended.
|
||||
So you should choose the database type for your use case (and possible future uses).
|
||||
|
||||
## Comparison
|
||||
|
||||
@@ -180,3 +180,23 @@ and it is automatically used if available.
|
||||
For SQLite and MySQL < 10.7 it has to be emulated if wanted, which is pretty slow. Therefore it has to be explicitly enabled by setting the
|
||||
`DATABASE_EMULATE_NATURAL_SORT` environment variable to `1`. If it is 0 the classical binary sorting is used, on these databases. The emulations
|
||||
might have some quirks and issues, so it is recommended to use a database which supports natural sorting natively, if you want to use it.
|
||||
|
||||
## Converting between database platforms
|
||||
|
||||
{: .important }
|
||||
The database conversion is still experimental. Therefore it is recommended to backup your database before performing a conversion, and check if everything works as expected afterwards.
|
||||
|
||||
If you want to change the database platform of your Part-DB installation (e.g. from SQLite to MySQL/MariaDB or PostgreSQL, or vice versa), there is the `partdb:migrations:convert-db-platform` console command, which can help you with that:
|
||||
|
||||
1. Make a backup of your current database to be safe if something goes wrong (see the backup documentation).
|
||||
2. Ensure that your database is at the latest schema by running the migrations: `php bin/console doctrine:migrations:migrate`
|
||||
3. Change the `DATABASE_URL` environment variable to the new database platform and connection information. Copy the old `DATABASE_URL` as you will need it later.
|
||||
4. Run `php bin/console doctrine:migrations:migrate` again to create the database schema in the new database. You will not need the admin password, that is shown when running the migrations.
|
||||
5. Run the conversion command, where you have to provide the old `DATABASE_URL` as parameter: `php bin/console partdb:migrations:convert-db-platform <OLD_DATABASE_URL>`
|
||||
Replace `<OLD_DATABASE_URL` with the actual old `DATABASE_URL` value (e.g. `sqlite:///%kernel.project_dir%/var/app.db`):
|
||||
```bash
|
||||
php bin/console partdb:migrations:convert-db-platform sqlite:///%kernel.project_dir%/var/app.db
|
||||
```
|
||||
6. The command will purge all data in the new database and copy all data from the old database to the new one. This might take some time and memory depending on the size of your database.
|
||||
7. Clear the cache: `php bin/console partdb:cache:clear`
|
||||
8. You can login with your existing user accounts in the new database now. Check if everything works as expected.
|
||||
|
||||
@@ -68,6 +68,7 @@ docker exec --user=www-data partdb php bin/console cache:clear
|
||||
deleted!*
|
||||
* `settings:migrate-env-to-settings`: Migrate configuration from environment variables to the settings interface.
|
||||
The value of the environment variable is copied to the settings database, so the environment variable can be removed afterwards without losing the configuration.
|
||||
* `partdb:migrations:convert-db-platform`: Convert the database platform (e.g. from SQLite to MySQL/MariaDB or PostgreSQL, or vice versa).
|
||||
|
||||
## Database commands
|
||||
|
||||
|
||||
@@ -260,6 +260,24 @@ This is not an official API and could break at any time. So use it at your own r
|
||||
The following env configuration options are available:
|
||||
* `PROVIDER_POLLIN_ENABLED`: Set this to `1` to enable the Pollin provider
|
||||
|
||||
### Buerklin
|
||||
|
||||
The Buerklin provider uses the [Buerklin API](https://www.buerklin.com/en/services/eprocurement/) to search for parts and get information.
|
||||
To use it you have to request access to the API.
|
||||
You will get an e-mail with the client ID and client secret, which you have to put in the Part-DB configuration (see below).
|
||||
|
||||
Please note that the Buerklin API is limited to 100 requests/minute per IP address and
|
||||
access to the Authentication server is limited to 10 requests/minute per IP address
|
||||
|
||||
The following env configuration options are available:
|
||||
|
||||
* `PROVIDER_BUERKLIN_CLIENT_ID`: The client ID you got from Buerklin (mandatory)
|
||||
* `PROVIDER_BUERKLIN_SECRET`: The client secret you got from Buerklin (mandatory)
|
||||
* `PROVIDER_BUERKLIN_USERNAME`: The username you got from Buerklin (mandatory)
|
||||
* `PROVIDER_BUERKLIN_PASSWORD`: The password you got from Buerklin (mandatory)
|
||||
* `PROVIDER_BUERKLIN_CURRENCY`: The currency you want to get prices in if available (optional, 3 letter ISO-code, default: `EUR`).
|
||||
* `PROVIDER_BUERKLIN_LANGUAGE`: The language you want to get the descriptions in. Possible values: `de` = German, `en` = English. (optional, default: `en`)
|
||||
|
||||
### Custom provider
|
||||
|
||||
To create a custom provider, you have to create a new class implementing the `InfoProviderInterface` interface. As long
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"popper.js": "^1.14.7",
|
||||
"regenerator-runtime": "^0.13.9",
|
||||
"webpack": "^5.74.0",
|
||||
"webpack-bundle-analyzer": "^4.3.0",
|
||||
"webpack-bundle-analyzer": "^5.1.1",
|
||||
"webpack-cli": "^5.1.0",
|
||||
"webpack-notifier": "^1.15.0"
|
||||
},
|
||||
@@ -65,7 +65,7 @@
|
||||
"json-formatter-js": "^2.3.4",
|
||||
"jszip": "^3.2.0",
|
||||
"katex": "^0.16.0",
|
||||
"marked": "^16.1.1",
|
||||
"marked": "^17.0.1",
|
||||
"marked-gfm-heading-id": "^4.1.1",
|
||||
"marked-mangle": "^1.0.1",
|
||||
"pdfmake": "^0.2.2",
|
||||
@@ -73,5 +73,8 @@
|
||||
"tom-select": "^2.1.0",
|
||||
"ts-loader": "^9.2.6",
|
||||
"typescript": "^5.7.2"
|
||||
},
|
||||
"resolutions": {
|
||||
"jquery": "^3.5.1"
|
||||
}
|
||||
}
|
||||
|
||||
253
src/Command/Migrations/DBPlatformConvertCommand.php
Normal file
253
src/Command/Migrations/DBPlatformConvertCommand.php
Normal file
@@ -0,0 +1,253 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
|
||||
namespace App\Command\Migrations;
|
||||
|
||||
use App\Entity\UserSystem\User;
|
||||
use App\Services\ImportExportSystem\PartKeeprImporter\PKImportHelper;
|
||||
use Doctrine\Bundle\DoctrineBundle\ConnectionFactory;
|
||||
use Doctrine\DBAL\Platforms\AbstractMySQLPlatform;
|
||||
use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
|
||||
use Doctrine\Migrations\Configuration\EntityManager\ExistingEntityManager;
|
||||
use Doctrine\Migrations\Configuration\Migration\ExistingConfiguration;
|
||||
use Doctrine\ORM\EntityManager;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Doctrine\Migrations\DependencyFactory;
|
||||
use Doctrine\ORM\Id\AssignedGenerator;
|
||||
use Doctrine\ORM\Mapping\ClassMetadata;
|
||||
use Symfony\Component\Console\Attribute\AsCommand;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
||||
|
||||
#[AsCommand('partdb:migrations:convert-db-platform', 'Convert the database to a different platform')]
|
||||
class DBPlatformConvertCommand extends Command
|
||||
{
|
||||
|
||||
public function __construct(
|
||||
private readonly EntityManagerInterface $targetEM,
|
||||
private readonly PKImportHelper $importHelper,
|
||||
private readonly DependencyFactory $dependencyFactory,
|
||||
#[Autowire('%kernel.project_dir%')]
|
||||
private readonly string $kernelProjectDir,
|
||||
)
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function configure(): void
|
||||
{
|
||||
$this
|
||||
->setHelp('This command allows you to migrate the database from one database platform to another (e.g. from MySQL to PostgreSQL).')
|
||||
->addArgument('url', InputArgument::REQUIRED, 'The database connection URL of the source database to migrate from');
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
$io = new SymfonyStyle($input, $output);
|
||||
|
||||
$sourceEM = $this->getSourceEm($input->getArgument('url'));
|
||||
|
||||
//Check that both databases are not using the same driver
|
||||
if ($sourceEM->getConnection()->getDatabasePlatform()::class === $this->targetEM->getConnection()->getDatabasePlatform()::class) {
|
||||
$io->warning('Source and target database are using the same database platform / driver. This command is only intended to migrate between different database platforms (e.g. from MySQL to PostgreSQL).');
|
||||
if (!$io->confirm('Do you want to continue anyway?', false)) {
|
||||
$io->info('Aborting migration process.');
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$this->ensureVersionUpToDate($sourceEM);
|
||||
|
||||
$io->note('This command is still in development. If you encounter any problems, please report them to the issue tracker on GitHub.');
|
||||
$io->warning(sprintf('This command will delete all existing data in the target database "%s". Make sure that you have no important data in the database before you continue!',
|
||||
$this->targetEM->getConnection()->getDatabase() ?? 'unknown'
|
||||
));
|
||||
|
||||
//$users = $sourceEM->getRepository(User::class)->findAll();
|
||||
//dump($users);
|
||||
|
||||
$io->ask('Please type "DELETE ALL DATA" to continue.', '', function ($answer) {
|
||||
if (strtoupper($answer) !== 'DELETE ALL DATA') {
|
||||
throw new \RuntimeException('You did not type "DELETE ALL DATA"!');
|
||||
}
|
||||
return $answer;
|
||||
});
|
||||
|
||||
|
||||
// Example migration logic (to be replaced with actual migration code)
|
||||
$io->info('Starting database migration...');
|
||||
|
||||
//Disable all event listeners on target EM to avoid unwanted side effects
|
||||
$eventManager = $this->targetEM->getEventManager();
|
||||
foreach ($eventManager->getAllListeners() as $event => $listeners) {
|
||||
foreach ($listeners as $listener) {
|
||||
$eventManager->removeEventListener($event, $listener);
|
||||
}
|
||||
}
|
||||
|
||||
$io->info('Clear target database...');
|
||||
$this->importHelper->purgeDatabaseForImport($this->targetEM, ['internal', 'migration_versions']);
|
||||
|
||||
$metadata = $this->targetEM->getMetadataFactory()->getAllMetadata();
|
||||
|
||||
$io->info('Modifying entity metadata for migration...');
|
||||
//First we modify each entity metadata to have an persist cascade on all relations
|
||||
foreach ($metadata as $metadatum) {
|
||||
$entityClass = $metadatum->getName();
|
||||
$io->writeln('Modifying cascade and ID settings for entity: ' . $entityClass, OutputInterface::VERBOSITY_VERBOSE);
|
||||
|
||||
foreach ($metadatum->getAssociationNames() as $fieldName) {
|
||||
$mapping = $metadatum->getAssociationMapping($fieldName);
|
||||
$mapping->cascade = array_unique(array_merge($mapping->cascade, ['persist']));
|
||||
$mapping->fetch = ClassMetadata::FETCH_EAGER; //Avoid lazy loading issues during migration
|
||||
|
||||
$metadatum->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
|
||||
$metadatum->setIdGenerator(new AssignedGenerator());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$io->progressStart(count($metadata));
|
||||
|
||||
//First we migrate users to avoid foreign key constraint issues
|
||||
$io->info('Migrating users first to avoid foreign key constraint issues...');
|
||||
$this->fixUsers($sourceEM);
|
||||
|
||||
//Afterward we migrate all entities
|
||||
foreach ($metadata as $metadatum) {
|
||||
//skip all superclasses
|
||||
if ($metadatum->isMappedSuperclass) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$entityClass = $metadatum->getName();
|
||||
|
||||
$io->note('Migrating entity: ' . $entityClass);
|
||||
|
||||
$repo = $sourceEM->getRepository($entityClass);
|
||||
$items = $repo->findAll();
|
||||
foreach ($items as $index => $item) {
|
||||
$this->targetEM->persist($item);
|
||||
}
|
||||
$this->targetEM->flush();
|
||||
}
|
||||
|
||||
$io->progressFinish();
|
||||
|
||||
|
||||
//Fix sequences / auto increment values on target database
|
||||
$io->info('Fixing sequences / auto increment values on target database...');
|
||||
$this->fixAutoIncrements($this->targetEM);
|
||||
|
||||
$io->success('Database migration completed successfully.');
|
||||
|
||||
if ($io->isVerbose()) {
|
||||
$io->info('Process took peak memory: ' . round(memory_get_peak_usage(true) / 1024 / 1024, 2) . ' MB');
|
||||
}
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a source EntityManager based on the given connection URL
|
||||
* @param string $url
|
||||
* @return EntityManagerInterface
|
||||
*/
|
||||
private function getSourceEm(string $url): EntityManagerInterface
|
||||
{
|
||||
//Replace any %kernel.project_dir% placeholders
|
||||
$url = str_replace('%kernel.project_dir%', $this->kernelProjectDir, $url);
|
||||
|
||||
$connectionFactory = new ConnectionFactory();
|
||||
$connection = $connectionFactory->createConnection(['url' => $url]);
|
||||
return new EntityManager($connection, $this->targetEM->getConfiguration());
|
||||
}
|
||||
|
||||
private function ensureVersionUpToDate(EntityManagerInterface $sourceEM): void
|
||||
{
|
||||
//Ensure that target database is up to date
|
||||
$migrationStatusCalculator = $this->dependencyFactory->getMigrationStatusCalculator();
|
||||
$newMigrations = $migrationStatusCalculator->getNewMigrations();
|
||||
if (count($newMigrations->getItems()) > 0) {
|
||||
throw new \RuntimeException("Target database is not up to date. Please run all migrations (with doctrine:migrations:migrate) before starting the migration process.");
|
||||
}
|
||||
|
||||
$sourceDependencyLoader = DependencyFactory::fromEntityManager(new ExistingConfiguration($this->dependencyFactory->getConfiguration()), new ExistingEntityManager($sourceEM));
|
||||
$sourceMigrationStatusCalculator = $sourceDependencyLoader->getMigrationStatusCalculator();
|
||||
$sourceNewMigrations = $sourceMigrationStatusCalculator->getNewMigrations();
|
||||
if (count($sourceNewMigrations->getItems()) > 0) {
|
||||
throw new \RuntimeException("Source database is not up to date. Please run all migrations (with doctrine:migrations:migrate) on the source database before starting the migration process.");
|
||||
}
|
||||
}
|
||||
|
||||
private function fixUsers(EntityManagerInterface $sourceEM): void
|
||||
{
|
||||
//To avoid a problem with (Column 'settings' cannot be null) in MySQL we need to migrate the user entities first
|
||||
//and fix the settings and backupCodes fields
|
||||
|
||||
$reflClass = new \ReflectionClass(User::class);
|
||||
foreach ($sourceEM->getRepository(User::class)->findAll() as $user) {
|
||||
foreach (['settings', 'backupCodes'] as $field) {
|
||||
$property = $reflClass->getProperty($field);
|
||||
if (!$property->isInitialized($user) || $property->getValue($user) === null) {
|
||||
$property->setValue($user, []);
|
||||
}
|
||||
}
|
||||
$this->targetEM->persist($user);
|
||||
}
|
||||
}
|
||||
|
||||
private function fixAutoIncrements(EntityManagerInterface $em): void
|
||||
{
|
||||
$connection = $em->getConnection();
|
||||
$platform = $connection->getDatabasePlatform();
|
||||
|
||||
if ($platform instanceof PostgreSQLPlatform) {
|
||||
$connection->executeStatement(
|
||||
//From: https://wiki.postgresql.org/wiki/Fixing_Sequences
|
||||
<<<SQL
|
||||
SELECT 'SELECT SETVAL(' ||
|
||||
quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
|
||||
', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
|
||||
quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
|
||||
FROM pg_class AS S,
|
||||
pg_depend AS D,
|
||||
pg_class AS T,
|
||||
pg_attribute AS C,
|
||||
pg_tables AS PGT
|
||||
WHERE S.relkind = 'S'
|
||||
AND S.oid = D.objid
|
||||
AND D.refobjid = T.oid
|
||||
AND D.refobjid = C.attrelid
|
||||
AND D.refobjsubid = C.attnum
|
||||
AND T.relname = PGT.tablename
|
||||
ORDER BY S.relname;
|
||||
SQL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -319,6 +319,7 @@ class PartListsController extends AbstractController
|
||||
|
||||
//As an unchecked checkbox is not set in the query, the default value for all bools have to be false (which is the default argument value)!
|
||||
$filter->setName($request->query->getBoolean('name'));
|
||||
$filter->setDbId($request->query->getBoolean('dbid'));
|
||||
$filter->setCategory($request->query->getBoolean('category'));
|
||||
$filter->setDescription($request->query->getBoolean('description'));
|
||||
$filter->setMpn($request->query->getBoolean('mpn'));
|
||||
|
||||
@@ -23,6 +23,7 @@ declare(strict_types=1);
|
||||
namespace App\DataTables\Filters;
|
||||
use App\DataTables\Filters\Constraints\AbstractConstraint;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
use Doctrine\DBAL\ParameterType;
|
||||
|
||||
class PartSearchFilter implements FilterInterface
|
||||
{
|
||||
@@ -33,6 +34,9 @@ class PartSearchFilter implements FilterInterface
|
||||
/** @var bool Use name field for searching */
|
||||
protected bool $name = true;
|
||||
|
||||
/** @var bool Use id field for searching */
|
||||
protected bool $dbId = false;
|
||||
|
||||
/** @var bool Use category name for searching */
|
||||
protected bool $category = true;
|
||||
|
||||
@@ -120,33 +124,51 @@ class PartSearchFilter implements FilterInterface
|
||||
public function apply(QueryBuilder $queryBuilder): void
|
||||
{
|
||||
$fields_to_search = $this->getFieldsToSearch();
|
||||
$is_numeric = preg_match('/^\d+$/', $this->keyword) === 1;
|
||||
|
||||
// Add exact ID match only when the keyword is numeric
|
||||
$search_dbId = $is_numeric && (bool)$this->dbId;
|
||||
|
||||
//If we have nothing to search for, do nothing
|
||||
if ($fields_to_search === [] || $this->keyword === '') {
|
||||
if (($fields_to_search === [] && !$search_dbId) || $this->keyword === '') {
|
||||
return;
|
||||
}
|
||||
|
||||
//Convert the fields to search to a list of expressions
|
||||
$expressions = array_map(function (string $field): string {
|
||||
$expressions = [];
|
||||
|
||||
if($fields_to_search !== []) {
|
||||
//Convert the fields to search to a list of expressions
|
||||
$expressions = array_map(function (string $field): string {
|
||||
if ($this->regex) {
|
||||
return sprintf("REGEXP(%s, :search_query) = TRUE", $field);
|
||||
}
|
||||
|
||||
return sprintf("ILIKE(%s, :search_query) = TRUE", $field);
|
||||
}, $fields_to_search);
|
||||
|
||||
//For regex, we pass the query as is, for like we add % to the start and end as wildcards
|
||||
if ($this->regex) {
|
||||
return sprintf("REGEXP(%s, :search_query) = TRUE", $field);
|
||||
$queryBuilder->setParameter('search_query', $this->keyword);
|
||||
} else {
|
||||
//Escape % and _ characters in the keyword
|
||||
$this->keyword = str_replace(['%', '_'], ['\%', '\_'], $this->keyword);
|
||||
$queryBuilder->setParameter('search_query', '%' . $this->keyword . '%');
|
||||
}
|
||||
}
|
||||
|
||||
return sprintf("ILIKE(%s, :search_query) = TRUE", $field);
|
||||
}, $fields_to_search);
|
||||
//Use equal expression to just search for exact numeric matches
|
||||
if ($search_dbId) {
|
||||
$expressions[] = $queryBuilder->expr()->eq('part.id', ':id_exact');
|
||||
$queryBuilder->setParameter('id_exact', (int) $this->keyword,
|
||||
\Doctrine\DBAL\ParameterType::INTEGER);
|
||||
}
|
||||
|
||||
//Add Or concatenation of the expressions to our query
|
||||
$queryBuilder->andWhere(
|
||||
$queryBuilder->expr()->orX(...$expressions)
|
||||
);
|
||||
|
||||
//For regex, we pass the query as is, for like we add % to the start and end as wildcards
|
||||
if ($this->regex) {
|
||||
$queryBuilder->setParameter('search_query', $this->keyword);
|
||||
} else {
|
||||
//Escape % and _ characters in the keyword
|
||||
$this->keyword = str_replace(['%', '_'], ['\%', '\_'], $this->keyword);
|
||||
$queryBuilder->setParameter('search_query', '%' . $this->keyword . '%');
|
||||
//Guard condition
|
||||
if (!empty($expressions)) {
|
||||
//Add Or concatenation of the expressions to our query
|
||||
$queryBuilder->andWhere(
|
||||
$queryBuilder->expr()->orX(...$expressions)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,6 +205,17 @@ class PartSearchFilter implements FilterInterface
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function isDbId(): bool
|
||||
{
|
||||
return $this->dbId;
|
||||
}
|
||||
|
||||
public function setDbId(bool $dbId): PartSearchFilter
|
||||
{
|
||||
$this->dbId = $dbId;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function isCategory(): bool
|
||||
{
|
||||
return $this->category;
|
||||
|
||||
@@ -29,6 +29,7 @@ use App\DataTables\Helpers\PartDataTableHelper;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Parts\Part;
|
||||
use App\Entity\ProjectSystem\ProjectBOMEntry;
|
||||
use App\Services\ElementTypeNameGenerator;
|
||||
use App\Services\EntityURLGenerator;
|
||||
use App\Services\Formatters\AmountFormatter;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
@@ -41,7 +42,8 @@ use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
class ProjectBomEntriesDataTable implements DataTableTypeInterface
|
||||
{
|
||||
public function __construct(protected TranslatorInterface $translator, protected PartDataTableHelper $partDataTableHelper, protected EntityURLGenerator $entityURLGenerator, protected AmountFormatter $amountFormatter)
|
||||
public function __construct(protected TranslatorInterface $translator, protected PartDataTableHelper $partDataTableHelper,
|
||||
protected EntityURLGenerator $entityURLGenerator, protected AmountFormatter $amountFormatter)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -79,7 +81,14 @@ class ProjectBomEntriesDataTable implements DataTableTypeInterface
|
||||
return htmlspecialchars($this->amountFormatter->format($context->getQuantity(), $context->getPart()->getPartUnit()));
|
||||
},
|
||||
])
|
||||
|
||||
->add('partId', TextColumn::class, [
|
||||
'label' => $this->translator->trans('project.bom.part_id'),
|
||||
'visible' => true,
|
||||
'orderField' => 'part.id',
|
||||
'render' => function ($value, ProjectBOMEntry $context) {
|
||||
return $context->getPart() instanceof Part ? (string) $context->getPart()->getId() : '';
|
||||
},
|
||||
])
|
||||
->add('name', TextColumn::class, [
|
||||
'label' => $this->translator->trans('part.table.name'),
|
||||
'orderField' => 'NATSORT(part.name)',
|
||||
|
||||
@@ -104,7 +104,7 @@ final class FieldHelper
|
||||
{
|
||||
$db_platform = $qb->getEntityManager()->getConnection()->getDatabasePlatform();
|
||||
|
||||
$key = 'field2_' . md5($field_expr);
|
||||
$key = 'field2_' . hash('xxh3', $field_expr);
|
||||
|
||||
//If we are on MySQL, we can just use the FIELD function
|
||||
if ($db_platform instanceof AbstractMySQLPlatform) {
|
||||
@@ -121,4 +121,4 @@ final class FieldHelper
|
||||
|
||||
return $qb;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,11 +24,13 @@ namespace App\Entity\Attachments;
|
||||
|
||||
use App\Entity\Base\AbstractNamedDBElement;
|
||||
use App\Entity\Base\MasterAttachmentTrait;
|
||||
use App\Entity\Base\AttachmentsTrait;
|
||||
use App\Entity\Contracts\HasAttachmentsInterface;
|
||||
use App\Entity\Contracts\HasMasterAttachmentInterface;
|
||||
use App\Repository\AttachmentContainingDBElementRepository;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
|
||||
/**
|
||||
* @template AT of Attachment
|
||||
@@ -37,18 +39,83 @@ use Doctrine\ORM\Mapping as ORM;
|
||||
abstract class AttachmentContainingDBElement extends AbstractNamedDBElement implements HasMasterAttachmentInterface, HasAttachmentsInterface
|
||||
{
|
||||
use MasterAttachmentTrait;
|
||||
use AttachmentsTrait;
|
||||
|
||||
/**
|
||||
* @var Collection<int, Attachment>
|
||||
* @phpstan-var Collection<int, AT>
|
||||
* ORM Mapping is done in subclasses (e.g. Part)
|
||||
*/
|
||||
#[Groups(['full', 'import'])]
|
||||
protected Collection $attachments;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->initializeAttachments();
|
||||
$this->attachments = new ArrayCollection();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
$this->cloneAttachments();
|
||||
if ($this->id) {
|
||||
$attachments = $this->attachments;
|
||||
$this->attachments = new ArrayCollection();
|
||||
//Set master attachment is needed
|
||||
foreach ($attachments as $attachment) {
|
||||
$clone = clone $attachment;
|
||||
if ($attachment === $this->master_picture_attachment) {
|
||||
$this->setMasterPictureAttachment($clone);
|
||||
}
|
||||
$this->addAttachment($clone);
|
||||
}
|
||||
}
|
||||
|
||||
//Parent has to be last call, as it resets the ID
|
||||
parent::__clone();
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
*
|
||||
* Getters
|
||||
*
|
||||
*********************************************************************************/
|
||||
|
||||
/**
|
||||
* Gets all attachments associated with this element.
|
||||
*/
|
||||
public function getAttachments(): Collection
|
||||
{
|
||||
return $this->attachments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an attachment to this element.
|
||||
*
|
||||
* @param Attachment $attachment Attachment
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addAttachment(Attachment $attachment): self
|
||||
{
|
||||
//Attachment must be associated with this element
|
||||
$attachment->setElement($this);
|
||||
$this->attachments->add($attachment);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the given attachment from this element.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function removeAttachment(Attachment $attachment): self
|
||||
{
|
||||
$this->attachments->removeElement($attachment);
|
||||
|
||||
//Check if this is the master attachment -> remove it from master attachment too, or it can not be deleted from DB...
|
||||
if ($attachment === $this->getMasterPictureAttachment()) {
|
||||
$this->setMasterPictureAttachment(null);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,14 +52,12 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
/**
|
||||
* Class AttachmentType.
|
||||
* @see \App\Tests\Entity\Attachments\AttachmentTypeTest
|
||||
* @extends AbstractStructuralDBElement<AttachmentTypeAttachment, AttachmentTypeParameter>
|
||||
*/
|
||||
#[ORM\Entity(repositoryClass: StructuralDBElementRepository::class)]
|
||||
#[ORM\Table(name: '`attachment_types`')]
|
||||
#[ORM\Index(columns: ['name'], name: 'attachment_types_idx_name')]
|
||||
#[ORM\Index(columns: ['parent_id', 'name'], name: 'attachment_types_idx_parent_name')]
|
||||
#[ORM\HasLifecycleCallbacks]
|
||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||
#[UniqueEntity(fields: ['name', 'parent'], message: 'structural.entity.unique_name', ignoreNull: false)]
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new Get(security: 'is_granted("read", object)'),
|
||||
@@ -86,16 +84,8 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
#[ApiFilter(LikeFilter::class, properties: ["name", "comment"])]
|
||||
#[ApiFilter(DateFilter::class, strategy: DateFilterInterface::EXCLUDE_NULL)]
|
||||
#[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])]
|
||||
class AttachmentType implements DBElementInterface, NamedElementInterface, TimeStampableInterface, HasAttachmentsInterface, HasMasterAttachmentInterface, StructuralElementInterface, HasParametersInterface, \Stringable, \JsonSerializable
|
||||
class AttachmentType extends AbstractStructuralDBElement
|
||||
{
|
||||
use DBElementTrait;
|
||||
use NamedElementTrait;
|
||||
use TimestampTrait;
|
||||
use AttachmentsTrait;
|
||||
use MasterAttachmentTrait;
|
||||
use StructuralElementTrait;
|
||||
use ParametersTrait;
|
||||
|
||||
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: AttachmentType::class, cascade: ['persist'])]
|
||||
#[ORM\OrderBy(['name' => Criteria::ASC])]
|
||||
protected Collection $children;
|
||||
@@ -104,10 +94,7 @@ class AttachmentType implements DBElementInterface, NamedElementInterface, TimeS
|
||||
#[ORM\JoinColumn(name: 'parent_id')]
|
||||
#[Groups(['attachment_type:read', 'attachment_type:write'])]
|
||||
#[ApiProperty(readableLink: true, writableLink: false)]
|
||||
protected ?self $parent = null;
|
||||
|
||||
#[Groups(['attachment_type:read', 'attachment_type:write'])]
|
||||
protected string $comment = '';
|
||||
protected ?AbstractStructuralDBElement $parent = null;
|
||||
|
||||
/**
|
||||
* @var string A comma separated list of file types, which are allowed for attachment files.
|
||||
@@ -136,7 +123,6 @@ class AttachmentType implements DBElementInterface, NamedElementInterface, TimeS
|
||||
/** @var Collection<int, AttachmentTypeParameter>
|
||||
*/
|
||||
#[Assert\Valid]
|
||||
#[UniqueObjectCollection(fields: ['name', 'group', 'element'])]
|
||||
#[ORM\OneToMany(mappedBy: 'element', targetEntity: AttachmentTypeParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||
#[ORM\OrderBy(['group' => Criteria::ASC, 'name' => 'ASC'])]
|
||||
#[Groups(['attachment_type:read', 'attachment_type:write', 'import', 'full'])]
|
||||
@@ -156,37 +142,13 @@ class AttachmentType implements DBElementInterface, NamedElementInterface, TimeS
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->initializeAttachments();
|
||||
$this->initializeStructuralElement();
|
||||
$this->children = new ArrayCollection();
|
||||
$this->parameters = new ArrayCollection();
|
||||
parent::__construct();
|
||||
$this->attachments = new ArrayCollection();
|
||||
$this->attachments_with_type = new ArrayCollection();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
if ($this->id) {
|
||||
$this->cloneDBElement();
|
||||
$this->cloneAttachments();
|
||||
|
||||
// We create a new object, so give it a new creation date
|
||||
$this->addedDate = null;
|
||||
|
||||
//Deep clone parameters
|
||||
$parameters = $this->parameters;
|
||||
$this->parameters = new ArrayCollection();
|
||||
foreach ($parameters as $parameter) {
|
||||
$this->addParameter(clone $parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return ['@id' => $this->getID()];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all attachments ("Attachment" objects) with this type.
|
||||
*
|
||||
|
||||
@@ -24,9 +24,11 @@ namespace App\Entity\Base;
|
||||
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Parameters\AbstractParameter;
|
||||
use App\Entity\Contracts\CompanyInterface;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use function is_string;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
/**
|
||||
* This abstract class is used for companies like suppliers or manufacturers.
|
||||
@@ -36,15 +38,226 @@ use Symfony\Component\Serializer\Annotation\Groups;
|
||||
* @extends AbstractPartsContainingDBElement<AT, PT>
|
||||
*/
|
||||
#[ORM\MappedSuperclass]
|
||||
abstract class AbstractCompany extends AbstractPartsContainingDBElement implements CompanyInterface
|
||||
abstract class AbstractCompany extends AbstractPartsContainingDBElement
|
||||
{
|
||||
use CompanyTrait;
|
||||
|
||||
#[Groups(['company:read'])]
|
||||
protected ?\DateTimeImmutable $addedDate = null;
|
||||
#[Groups(['company:read'])]
|
||||
protected ?\DateTimeImmutable $lastModified = null;
|
||||
|
||||
/**
|
||||
* @var string The address of the company
|
||||
*/
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $address = '';
|
||||
|
||||
/**
|
||||
* @var string The phone number of the company
|
||||
*/
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $phone_number = '';
|
||||
|
||||
/**
|
||||
* @var string The fax number of the company
|
||||
*/
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $fax_number = '';
|
||||
|
||||
/**
|
||||
* @var string The email address of the company
|
||||
*/
|
||||
#[Assert\Email]
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $email_address = '';
|
||||
|
||||
/**
|
||||
* @var string The website of the company
|
||||
*/
|
||||
#[Assert\Url(requireTld: false)]
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING, length: 2048)]
|
||||
#[Assert\Length(max: 2048)]
|
||||
protected string $website = '';
|
||||
|
||||
#[Groups(['company:read', 'company:write', 'import', 'full', 'extended'])]
|
||||
protected string $comment = '';
|
||||
|
||||
/**
|
||||
* @var string The link to the website of an article. Use %PARTNUMBER% as placeholder for the part number.
|
||||
*/
|
||||
#[ORM\Column(type: Types::STRING, length: 2048)]
|
||||
#[Assert\Length(max: 2048)]
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
protected string $auto_product_url = '';
|
||||
|
||||
/********************************************************************************
|
||||
*
|
||||
* Getters
|
||||
*
|
||||
*********************************************************************************/
|
||||
|
||||
/**
|
||||
* Get the address.
|
||||
*
|
||||
* @return string the address of the company (with "\n" as line break)
|
||||
*/
|
||||
public function getAddress(): string
|
||||
{
|
||||
return $this->address;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the phone number.
|
||||
*
|
||||
* @return string the phone number of the company
|
||||
*/
|
||||
public function getPhoneNumber(): string
|
||||
{
|
||||
return $this->phone_number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the fax number.
|
||||
*
|
||||
* @return string the fax number of the company
|
||||
*/
|
||||
public function getFaxNumber(): string
|
||||
{
|
||||
return $this->fax_number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the e-mail address.
|
||||
*
|
||||
* @return string the e-mail address of the company
|
||||
*/
|
||||
public function getEmailAddress(): string
|
||||
{
|
||||
return $this->email_address;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the website.
|
||||
*
|
||||
* @return string the website of the company
|
||||
*/
|
||||
public function getWebsite(): string
|
||||
{
|
||||
return $this->website;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the link to the website of an article.
|
||||
*
|
||||
* @param string|null $partnr * NULL for returning the URL with a placeholder for the part number
|
||||
* * or the part number for returning the direct URL to the article
|
||||
*
|
||||
* @return string the link to the article
|
||||
*/
|
||||
public function getAutoProductUrl(?string $partnr = null): string
|
||||
{
|
||||
if (is_string($partnr)) {
|
||||
return str_replace('%PARTNUMBER%', $partnr, $this->auto_product_url);
|
||||
}
|
||||
|
||||
return $this->auto_product_url;
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
*
|
||||
* Setters
|
||||
*
|
||||
*********************************************************************************/
|
||||
|
||||
/**
|
||||
* Set the addres.
|
||||
*
|
||||
* @param string $new_address the new address (with "\n" as line break)
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setAddress(string $new_address): self
|
||||
{
|
||||
$this->address = $new_address;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the phone number.
|
||||
*
|
||||
* @param string $new_phone_number the new phone number
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setPhoneNumber(string $new_phone_number): self
|
||||
{
|
||||
$this->phone_number = $new_phone_number;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the fax number.
|
||||
*
|
||||
* @param string $new_fax_number the new fax number
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setFaxNumber(string $new_fax_number): self
|
||||
{
|
||||
$this->fax_number = $new_fax_number;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the e-mail address.
|
||||
*
|
||||
* @param string $new_email_address the new e-mail address
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setEmailAddress(string $new_email_address): self
|
||||
{
|
||||
$this->email_address = $new_email_address;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the website.
|
||||
*
|
||||
* @param string $new_website the new website
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setWebsite(string $new_website): self
|
||||
{
|
||||
$this->website = $new_website;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the link to the website of an article.
|
||||
*
|
||||
* @param string $new_url the new URL with the placeholder %PARTNUMBER% for the part number
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setAutoProductUrl(string $new_url): self
|
||||
{
|
||||
$this->auto_product_url = $new_url;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@ use App\Entity\Attachments\ProjectAttachment;
|
||||
use App\Entity\Attachments\StorageLocationAttachment;
|
||||
use App\Entity\Attachments\SupplierAttachment;
|
||||
use App\Entity\Attachments\UserAttachment;
|
||||
use App\Entity\Contracts\DBElementInterface;
|
||||
use App\Entity\Parameters\AbstractParameter;
|
||||
use App\Entity\Parts\Category;
|
||||
use App\Entity\PriceInformations\Pricedetail;
|
||||
@@ -57,9 +56,11 @@ use App\Entity\Parts\MeasurementUnit;
|
||||
use App\Entity\Parts\Supplier;
|
||||
use App\Entity\UserSystem\User;
|
||||
use App\Repository\DBElementRepository;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use JsonSerializable;
|
||||
use Symfony\Component\Serializer\Annotation\DiscriminatorMap;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
|
||||
/**
|
||||
* This class is for managing all database objects.
|
||||
@@ -105,13 +106,36 @@ use Symfony\Component\Serializer\Annotation\DiscriminatorMap;
|
||||
'user' => User::class]
|
||||
)]
|
||||
#[ORM\MappedSuperclass(repositoryClass: DBElementRepository::class)]
|
||||
abstract class AbstractDBElement implements JsonSerializable, DBElementInterface
|
||||
abstract class AbstractDBElement implements JsonSerializable
|
||||
{
|
||||
use DBElementTrait;
|
||||
/** @var int|null The Identification number for this part. This value is unique for the element in this table.
|
||||
* Null if the element is not saved to DB yet.
|
||||
*/
|
||||
#[Groups(['full', 'api:basic:read'])]
|
||||
#[ORM\Column(type: Types::INTEGER)]
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue]
|
||||
protected ?int $id = null;
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
$this->cloneDBElement();
|
||||
if ($this->id) {
|
||||
//Set ID to null, so that an new entry is created
|
||||
$this->id = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ID. The ID can be zero, or even negative (for virtual elements). If an element is virtual, can be
|
||||
* checked with isVirtualElement().
|
||||
*
|
||||
* Returns null, if the element is not saved to the DB yet.
|
||||
*
|
||||
* @return int|null the ID of this element
|
||||
*/
|
||||
public function getID(): ?int
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
|
||||
@@ -23,9 +23,12 @@ declare(strict_types=1);
|
||||
namespace App\Entity\Base;
|
||||
|
||||
use App\Repository\NamedDBElementRepository;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use App\Entity\Contracts\NamedElementInterface;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
/**
|
||||
* All subclasses of this class have an attribute "name".
|
||||
@@ -35,7 +38,26 @@ use Doctrine\ORM\Mapping as ORM;
|
||||
abstract class AbstractNamedDBElement extends AbstractDBElement implements NamedElementInterface, TimeStampableInterface, \Stringable
|
||||
{
|
||||
use TimestampTrait;
|
||||
use NamedElementTrait;
|
||||
|
||||
/**
|
||||
* @var string The name of this element
|
||||
*/
|
||||
#[Assert\NotBlank]
|
||||
#[Groups(['simple', 'extended', 'full', 'import', 'api:basic:read', 'api:basic:write'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $name = '';
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Helpers
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->getName();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
@@ -43,6 +65,40 @@ abstract class AbstractNamedDBElement extends AbstractDBElement implements Named
|
||||
//We create a new object, so give it a new creation date
|
||||
$this->addedDate = null;
|
||||
}
|
||||
parent::__clone();
|
||||
parent::__clone(); // TODO: Change the autogenerated stub
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
*
|
||||
* Getters
|
||||
*
|
||||
*********************************************************************************/
|
||||
|
||||
/**
|
||||
* Get the name of this element.
|
||||
*
|
||||
* @return string the name of this element
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
*
|
||||
* Setters
|
||||
*
|
||||
*********************************************************************************/
|
||||
|
||||
/**
|
||||
* Change the name of this element.
|
||||
*
|
||||
* @param string $new_name the new name
|
||||
*/
|
||||
public function setName(string $new_name): self
|
||||
{
|
||||
$this->name = $new_name;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,18 +24,22 @@ namespace App\Entity\Base;
|
||||
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Parameters\AbstractParameter;
|
||||
use App\Entity\Contracts\StructuralElementInterface;
|
||||
use App\Entity\Contracts\HasParametersInterface;
|
||||
use App\Repository\StructuralDBElementRepository;
|
||||
use App\EntityListeners\TreeCacheInvalidationListener;
|
||||
use App\Validator\Constraints\UniqueObjectCollection;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use App\Entity\Attachments\AttachmentContainingDBElement;
|
||||
use App\Entity\Parameters\ParametersTrait;
|
||||
use App\Validator\Constraints\NoneOfItsChildren;
|
||||
use Symfony\Component\Serializer\Annotation\SerializedName;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
use function count;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use InvalidArgumentException;
|
||||
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
|
||||
/**
|
||||
* All elements with the fields "id", "name" and "parent_id" (at least).
|
||||
@@ -58,10 +62,52 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
#[UniqueEntity(fields: ['name', 'parent'], message: 'structural.entity.unique_name', ignoreNull: false)]
|
||||
#[ORM\MappedSuperclass(repositoryClass: StructuralDBElementRepository::class)]
|
||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||
abstract class AbstractStructuralDBElement extends AttachmentContainingDBElement implements StructuralElementInterface, HasParametersInterface
|
||||
abstract class AbstractStructuralDBElement extends AttachmentContainingDBElement
|
||||
{
|
||||
use ParametersTrait;
|
||||
use StructuralElementTrait;
|
||||
|
||||
/**
|
||||
* This is a not standard character, so build a const, so a dev can easily use it.
|
||||
*/
|
||||
final public const PATH_DELIMITER_ARROW = ' → ';
|
||||
|
||||
/**
|
||||
* @var string The comment info for this element as markdown
|
||||
*/
|
||||
#[Groups(['full', 'import'])]
|
||||
#[ORM\Column(type: Types::TEXT)]
|
||||
protected string $comment = '';
|
||||
|
||||
/**
|
||||
* @var bool If this property is set, this element can not be selected for part properties.
|
||||
* Useful if this element should be used only for grouping, sorting.
|
||||
*/
|
||||
#[Groups(['full', 'import'])]
|
||||
#[ORM\Column(type: Types::BOOLEAN)]
|
||||
protected bool $not_selectable = false;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
protected int $level = 0;
|
||||
|
||||
/**
|
||||
* We can not define the mapping here, or we will get an exception. Unfortunately we have to do the mapping in the
|
||||
* subclasses.
|
||||
*
|
||||
* @var Collection<int, AbstractStructuralDBElement>
|
||||
* @phpstan-var Collection<int, static>
|
||||
*/
|
||||
#[Groups(['include_children'])]
|
||||
protected Collection $children;
|
||||
|
||||
/**
|
||||
* @var AbstractStructuralDBElement|null
|
||||
* @phpstan-var static|null
|
||||
*/
|
||||
#[Groups(['include_parents', 'import'])]
|
||||
#[NoneOfItsChildren]
|
||||
protected ?AbstractStructuralDBElement $parent = null;
|
||||
|
||||
/**
|
||||
* Mapping done in subclasses.
|
||||
@@ -73,10 +119,21 @@ abstract class AbstractStructuralDBElement extends AttachmentContainingDBElement
|
||||
#[UniqueObjectCollection(fields: ['name', 'group', 'element'])]
|
||||
protected Collection $parameters;
|
||||
|
||||
/** @var string[] all names of all parent elements as an array of strings,
|
||||
* the last array element is the name of the element itself
|
||||
*/
|
||||
private array $full_path_strings = [];
|
||||
|
||||
/**
|
||||
* Alternative names (semicolon-separated) for this element, which can be used for searching (especially for info provider system)
|
||||
*/
|
||||
#[ORM\Column(type: Types::TEXT, nullable: true, options: ['default' => null])]
|
||||
private ?string $alternative_names = "";
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->initializeStructuralElement();
|
||||
$this->children = new ArrayCollection();
|
||||
$this->parameters = new ArrayCollection();
|
||||
}
|
||||
|
||||
@@ -92,4 +149,307 @@ abstract class AbstractStructuralDBElement extends AttachmentContainingDBElement
|
||||
}
|
||||
parent::__clone();
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* StructuralDBElement constructor.
|
||||
*****************************************************************************/
|
||||
|
||||
/**
|
||||
* Check if this element is a child of another element (recursive).
|
||||
*
|
||||
* @param AbstractStructuralDBElement $another_element the object to compare
|
||||
* IMPORTANT: both objects to compare must be from the same class (for example two "Device" objects)!
|
||||
*
|
||||
* @return bool true, if this element is child of $another_element
|
||||
*
|
||||
* @throws InvalidArgumentException if there was an error
|
||||
*/
|
||||
public function isChildOf(self $another_element): bool
|
||||
{
|
||||
$class_name = static::class;
|
||||
|
||||
//Check if both elements compared, are from the same type
|
||||
// (we have to check inheritance, or we get exceptions when using doctrine entities (they have a proxy type):
|
||||
if (!$another_element instanceof $class_name && !is_a($this, $another_element::class)) {
|
||||
throw new InvalidArgumentException('isChildOf() only works for objects of the same type!');
|
||||
}
|
||||
|
||||
if (!$this->getParent() instanceof self) { // this is the root node
|
||||
return false;
|
||||
}
|
||||
|
||||
//If the parent element is equal to the element we want to compare, return true
|
||||
if ($this->getParent()->getID() === null) {
|
||||
//If the IDs are not yet defined, we have to compare the objects itself
|
||||
if ($this->getParent() === $another_element) {
|
||||
return true;
|
||||
}
|
||||
} elseif ($this->getParent()->getID() === $another_element->getID()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
//Otherwise, check recursively
|
||||
return $this->parent->isChildOf($another_element);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this element is an root element (has no parent).
|
||||
*
|
||||
* @return bool true if this element is a root element
|
||||
*/
|
||||
public function isRoot(): bool
|
||||
{
|
||||
return $this->parent === null;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Getters
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* Get the parent of this element.
|
||||
*
|
||||
* @return static|null The parent element. Null if this element, does not have a parent.
|
||||
*/
|
||||
public function getParent(): ?self
|
||||
{
|
||||
return $this->parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the comment of the element as markdown encoded string.
|
||||
|
||||
*
|
||||
* @return string the comment
|
||||
*/
|
||||
public function getComment(): ?string
|
||||
{
|
||||
return $this->comment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the level.
|
||||
*
|
||||
* The level of the root node is -1.
|
||||
*
|
||||
* @return int the level of this element (zero means a most top element
|
||||
* [a sub element of the root node])
|
||||
*/
|
||||
public function getLevel(): int
|
||||
{
|
||||
/*
|
||||
* Only check for nodes that have a parent. In the other cases zero is correct.
|
||||
*/
|
||||
if (0 === $this->level && $this->parent instanceof self) {
|
||||
$element = $this->parent;
|
||||
while ($element instanceof self) {
|
||||
/** @var AbstractStructuralDBElement $element */
|
||||
$element = $element->parent;
|
||||
++$this->level;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->level;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the full path.
|
||||
*
|
||||
* @param string $delimiter the delimiter of the returned string
|
||||
*
|
||||
* @return string the full path (incl. the name of this element), delimited by $delimiter
|
||||
*/
|
||||
#[Groups(['api:basic:read'])]
|
||||
#[SerializedName('full_path')]
|
||||
public function getFullPath(string $delimiter = self::PATH_DELIMITER_ARROW): string
|
||||
{
|
||||
if ($this->full_path_strings === []) {
|
||||
$this->full_path_strings = [];
|
||||
$this->full_path_strings[] = $this->getName();
|
||||
$element = $this;
|
||||
|
||||
$overflow = 20; //We only allow 20 levels depth
|
||||
|
||||
while ($element->parent instanceof self && $overflow >= 0) {
|
||||
$element = $element->parent;
|
||||
$this->full_path_strings[] = $element->getName();
|
||||
//Decrement to prevent mem overflow.
|
||||
--$overflow;
|
||||
}
|
||||
|
||||
$this->full_path_strings = array_reverse($this->full_path_strings);
|
||||
}
|
||||
|
||||
return implode($delimiter, $this->full_path_strings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the path to this element (including the element itself).
|
||||
*
|
||||
* @return self[] An array with all (recursively) parent elements (including this one),
|
||||
* ordered from the lowest levels (root node) first to the highest level (the element itself)
|
||||
*/
|
||||
public function getPathArray(): array
|
||||
{
|
||||
$tmp = [];
|
||||
$tmp[] = $this;
|
||||
|
||||
//We only allow 20 levels depth
|
||||
while (!end($tmp)->isRoot() && count($tmp) < 20) {
|
||||
$tmp[] = end($tmp)->parent;
|
||||
}
|
||||
|
||||
return array_reverse($tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all sub elements of this element.
|
||||
*
|
||||
* @return Collection<static>|iterable all subelements as an array of objects (sorted by their full path)
|
||||
* @psalm-return Collection<int, static>
|
||||
*/
|
||||
public function getSubelements(): iterable
|
||||
{
|
||||
//If the parent is equal to this object, we would get an endless loop, so just return an empty array
|
||||
//This is just a workaround, as validator should prevent this behaviour, before it gets written to the database
|
||||
if ($this->parent === $this) {
|
||||
return new ArrayCollection();
|
||||
}
|
||||
|
||||
//@phpstan-ignore-next-line
|
||||
return $this->children ?? new ArrayCollection();
|
||||
}
|
||||
|
||||
/**
|
||||
* @see getSubelements()
|
||||
* @return Collection<static>|iterable
|
||||
* @psalm-return Collection<int, static>
|
||||
*/
|
||||
public function getChildren(): iterable
|
||||
{
|
||||
return $this->getSubelements();
|
||||
}
|
||||
|
||||
public function isNotSelectable(): bool
|
||||
{
|
||||
return $this->not_selectable;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Setters
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* Sets the new parent object.
|
||||
*
|
||||
* @param static|null $new_parent The new parent object
|
||||
* @return $this
|
||||
*/
|
||||
public function setParent(?self $new_parent): self
|
||||
{
|
||||
/*
|
||||
if ($new_parent->isChildOf($this)) {
|
||||
throw new \InvalidArgumentException('You can not use one of the element childs as parent!');
|
||||
} */
|
||||
|
||||
$this->parent = $new_parent;
|
||||
|
||||
//Add this element as child to the new parent
|
||||
if ($new_parent instanceof self) {
|
||||
$new_parent->getChildren()->add($this);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the comment.
|
||||
*
|
||||
* @param string $new_comment the new comment
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setComment(string $new_comment): self
|
||||
{
|
||||
$this->comment = $new_comment;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the given element as child to this element.
|
||||
* @param static $child
|
||||
* @return $this
|
||||
*/
|
||||
public function addChild(self $child): self
|
||||
{
|
||||
$this->children->add($child);
|
||||
//Children get this element as parent
|
||||
$child->setParent($this);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the given element as child from this element.
|
||||
* @param static $child
|
||||
* @return $this
|
||||
*/
|
||||
public function removeChild(self $child): self
|
||||
{
|
||||
$this->children->removeElement($child);
|
||||
//Children has no parent anymore
|
||||
$child->setParent(null);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractStructuralDBElement
|
||||
*/
|
||||
public function setNotSelectable(bool $not_selectable): self
|
||||
{
|
||||
$this->not_selectable = $not_selectable;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function clearChildren(): self
|
||||
{
|
||||
$this->children = new ArrayCollection();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a comma separated list of alternative names.
|
||||
* @return string|null
|
||||
*/
|
||||
public function getAlternativeNames(): ?string
|
||||
{
|
||||
if ($this->alternative_names === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
//Remove trailing comma
|
||||
return rtrim($this->alternative_names, ',');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a comma separated list of alternative names.
|
||||
* @return $this
|
||||
*/
|
||||
public function setAlternativeNames(?string $new_value): self
|
||||
{
|
||||
//Add a trailing comma, if not already there (makes it easier to find in the database)
|
||||
if (is_string($new_value) && !str_ends_with($new_value, ',')) {
|
||||
$new_value .= ',';
|
||||
}
|
||||
|
||||
$this->alternative_names = $new_value;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Entity\Base;
|
||||
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
|
||||
/**
|
||||
* Trait providing attachments functionality.
|
||||
*
|
||||
* Requirements:
|
||||
* - Class using this trait should have $id property (e.g., via DBElementTrait)
|
||||
* - Class using this trait should use MasterAttachmentTrait for full functionality
|
||||
* - Class should implement HasAttachmentsInterface
|
||||
*
|
||||
* Note: This trait has an optional dependency on MasterAttachmentTrait.
|
||||
* If MasterAttachmentTrait is used, the removeAttachment and cloneAttachments methods
|
||||
* will handle master picture attachment properly. Otherwise, those checks are no-ops.
|
||||
*/
|
||||
trait AttachmentsTrait
|
||||
{
|
||||
/**
|
||||
* @var Collection<int, Attachment>
|
||||
* ORM Mapping is done in subclasses (e.g. Part)
|
||||
*/
|
||||
#[Groups(['full', 'import'])]
|
||||
protected Collection $attachments;
|
||||
|
||||
/**
|
||||
* Initialize the attachments collection.
|
||||
*/
|
||||
protected function initializeAttachments(): void
|
||||
{
|
||||
$this->attachments = new ArrayCollection();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all attachments associated with this element.
|
||||
*/
|
||||
public function getAttachments(): Collection
|
||||
{
|
||||
return $this->attachments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an attachment to this element.
|
||||
*
|
||||
* @param Attachment $attachment Attachment
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addAttachment(Attachment $attachment): self
|
||||
{
|
||||
//Attachment must be associated with this element
|
||||
$attachment->setElement($this);
|
||||
$this->attachments->add($attachment);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the given attachment from this element.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function removeAttachment(Attachment $attachment): self
|
||||
{
|
||||
$this->attachments->removeElement($attachment);
|
||||
|
||||
//Check if this is the master attachment -> remove it from master attachment too, or it can not be deleted from DB...
|
||||
if ($this->master_picture_attachment !== null && $attachment === $this->master_picture_attachment) {
|
||||
$this->setMasterPictureAttachment(null);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clone helper for attachments - deep clones all attachments.
|
||||
*/
|
||||
protected function cloneAttachments(): void
|
||||
{
|
||||
if (isset($this->id) && $this->id) {
|
||||
$attachments = $this->attachments;
|
||||
$this->attachments = new ArrayCollection();
|
||||
//Set master attachment is needed
|
||||
foreach ($attachments as $attachment) {
|
||||
$clone = clone $attachment;
|
||||
if ($this->master_picture_attachment !== null && $attachment === $this->master_picture_attachment) {
|
||||
$this->setMasterPictureAttachment($clone);
|
||||
}
|
||||
$this->addAttachment($clone);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,236 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Entity\Base;
|
||||
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
use function is_string;
|
||||
|
||||
/**
|
||||
* Trait for company-specific fields like address, phone, email, etc.
|
||||
*/
|
||||
trait CompanyTrait
|
||||
{
|
||||
/**
|
||||
* @var string The address of the company
|
||||
*/
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $address = '';
|
||||
|
||||
/**
|
||||
* @var string The phone number of the company
|
||||
*/
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $phone_number = '';
|
||||
|
||||
/**
|
||||
* @var string The fax number of the company
|
||||
*/
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $fax_number = '';
|
||||
|
||||
/**
|
||||
* @var string The email address of the company
|
||||
*/
|
||||
#[Assert\Email]
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $email_address = '';
|
||||
|
||||
/**
|
||||
* @var string The website of the company
|
||||
*/
|
||||
#[Assert\Url(requireTld: false)]
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
#[ORM\Column(type: Types::STRING, length: 2048)]
|
||||
#[Assert\Length(max: 2048)]
|
||||
protected string $website = '';
|
||||
|
||||
/**
|
||||
* @var string The link to the website of an article. Use %PARTNUMBER% as placeholder for the part number.
|
||||
*/
|
||||
#[ORM\Column(type: Types::STRING, length: 2048)]
|
||||
#[Assert\Length(max: 2048)]
|
||||
#[Groups(['full', 'company:read', 'company:write', 'import', 'extended'])]
|
||||
protected string $auto_product_url = '';
|
||||
|
||||
/**
|
||||
* Get the address.
|
||||
*
|
||||
* @return string the address of the company (with "\n" as line break)
|
||||
*/
|
||||
public function getAddress(): string
|
||||
{
|
||||
return $this->address;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the address.
|
||||
*
|
||||
* @param string $new_address the new address (with "\n" as line break)
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setAddress(string $new_address): self
|
||||
{
|
||||
$this->address = $new_address;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the phone number.
|
||||
*
|
||||
* @return string the phone number of the company
|
||||
*/
|
||||
public function getPhoneNumber(): string
|
||||
{
|
||||
return $this->phone_number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the phone number.
|
||||
*
|
||||
* @param string $new_phone_number the new phone number
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setPhoneNumber(string $new_phone_number): self
|
||||
{
|
||||
$this->phone_number = $new_phone_number;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the fax number.
|
||||
*
|
||||
* @return string the fax number of the company
|
||||
*/
|
||||
public function getFaxNumber(): string
|
||||
{
|
||||
return $this->fax_number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the fax number.
|
||||
*
|
||||
* @param string $new_fax_number the new fax number
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setFaxNumber(string $new_fax_number): self
|
||||
{
|
||||
$this->fax_number = $new_fax_number;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the e-mail address.
|
||||
*
|
||||
* @return string the e-mail address of the company
|
||||
*/
|
||||
public function getEmailAddress(): string
|
||||
{
|
||||
return $this->email_address;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the e-mail address.
|
||||
*
|
||||
* @param string $new_email_address the new e-mail address
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setEmailAddress(string $new_email_address): self
|
||||
{
|
||||
$this->email_address = $new_email_address;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the website.
|
||||
*
|
||||
* @return string the website of the company
|
||||
*/
|
||||
public function getWebsite(): string
|
||||
{
|
||||
return $this->website;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the website.
|
||||
*
|
||||
* @param string $new_website the new website
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setWebsite(string $new_website): self
|
||||
{
|
||||
$this->website = $new_website;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the link to the website of an article.
|
||||
*
|
||||
* @param string|null $partnr * NULL for returning the URL with a placeholder for the part number
|
||||
* * or the part number for returning the direct URL to the article
|
||||
*
|
||||
* @return string the link to the article
|
||||
*/
|
||||
public function getAutoProductUrl(?string $partnr = null): string
|
||||
{
|
||||
if (is_string($partnr)) {
|
||||
return str_replace('%PARTNUMBER%', $partnr, $this->auto_product_url);
|
||||
}
|
||||
|
||||
return $this->auto_product_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the link to the website of an article.
|
||||
*
|
||||
* @param string $new_url the new URL with the placeholder %PARTNUMBER% for the part number
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setAutoProductUrl(string $new_url): self
|
||||
{
|
||||
$this->auto_product_url = $new_url;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Entity\Base;
|
||||
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
|
||||
/**
|
||||
* Trait providing basic database element functionality with an ID.
|
||||
*/
|
||||
trait DBElementTrait
|
||||
{
|
||||
/**
|
||||
* @var int|null The Identification number for this element. This value is unique for the element in this table.
|
||||
* Null if the element is not saved to DB yet.
|
||||
*/
|
||||
#[Groups(['full', 'api:basic:read'])]
|
||||
#[ORM\Column(type: Types::INTEGER)]
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue]
|
||||
protected ?int $id = null;
|
||||
|
||||
/**
|
||||
* Get the ID. The ID can be zero, or even negative (for virtual elements). If an element is virtual, can be
|
||||
* checked with isVirtualElement().
|
||||
*
|
||||
* Returns null, if the element is not saved to the DB yet.
|
||||
*
|
||||
* @return int|null the ID of this element
|
||||
*/
|
||||
public function getID(): ?int
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clone helper for DB element - resets ID on clone.
|
||||
*/
|
||||
protected function cloneDBElement(): void
|
||||
{
|
||||
if ($this->id) {
|
||||
//Set ID to null, so that a new entry is created
|
||||
$this->id = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Entity\Base;
|
||||
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
/**
|
||||
* Trait providing named element functionality.
|
||||
*/
|
||||
trait NamedElementTrait
|
||||
{
|
||||
/**
|
||||
* @var string The name of this element
|
||||
*/
|
||||
#[Assert\NotBlank]
|
||||
#[Groups(['simple', 'extended', 'full', 'import', 'api:basic:read', 'api:basic:write'])]
|
||||
#[ORM\Column(type: Types::STRING)]
|
||||
#[Assert\Length(max: 255)]
|
||||
protected string $name = '';
|
||||
|
||||
/**
|
||||
* Get the name of this element.
|
||||
*
|
||||
* @return string the name of this element
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the name of this element.
|
||||
*
|
||||
* @param string $new_name the new name
|
||||
*/
|
||||
public function setName(string $new_name): self
|
||||
{
|
||||
$this->name = $new_name;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* String representation returns the name.
|
||||
*/
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->getName();
|
||||
}
|
||||
}
|
||||
@@ -1,381 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Entity\Base;
|
||||
|
||||
use App\Validator\Constraints\NoneOfItsChildren;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use InvalidArgumentException;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Serializer\Annotation\SerializedName;
|
||||
use function count;
|
||||
|
||||
/**
|
||||
* Trait for structural/hierarchical elements forming a tree structure.
|
||||
*
|
||||
* Requirements:
|
||||
* - Class using this trait must have getName() method (e.g., via NamedElementTrait)
|
||||
* - Class using this trait must have getID() method (e.g., via DBElementTrait)
|
||||
* - Class should implement StructuralElementInterface
|
||||
*/
|
||||
trait StructuralElementTrait
|
||||
{
|
||||
/**
|
||||
* This is a not standard character, so build a const, so a dev can easily use it.
|
||||
*/
|
||||
final public const PATH_DELIMITER_ARROW = ' → ';
|
||||
|
||||
/**
|
||||
* @var string The comment info for this element as markdown
|
||||
*/
|
||||
#[Groups(['full', 'import'])]
|
||||
#[ORM\Column(type: Types::TEXT)]
|
||||
protected string $comment = '';
|
||||
|
||||
/**
|
||||
* @var bool If this property is set, this element can not be selected for part properties.
|
||||
* Useful if this element should be used only for grouping, sorting.
|
||||
*/
|
||||
#[Groups(['full', 'import'])]
|
||||
#[ORM\Column(type: Types::BOOLEAN)]
|
||||
protected bool $not_selectable = false;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
protected int $level = 0;
|
||||
|
||||
/**
|
||||
* We can not define the mapping here, or we will get an exception. Unfortunately we have to do the mapping in the
|
||||
* subclasses.
|
||||
*
|
||||
* @var Collection<int, static>
|
||||
*/
|
||||
#[Groups(['include_children'])]
|
||||
protected Collection $children;
|
||||
|
||||
/**
|
||||
* @var static|null
|
||||
*/
|
||||
#[Groups(['include_parents', 'import'])]
|
||||
#[NoneOfItsChildren]
|
||||
protected ?self $parent = null;
|
||||
|
||||
/** @var string[] all names of all parent elements as an array of strings,
|
||||
* the last array element is the name of the element itself
|
||||
*/
|
||||
private array $full_path_strings = [];
|
||||
|
||||
/**
|
||||
* Alternative names (semicolon-separated) for this element, which can be used for searching (especially for info provider system)
|
||||
*/
|
||||
#[ORM\Column(type: Types::TEXT, nullable: true, options: ['default' => null])]
|
||||
private ?string $alternative_names = '';
|
||||
|
||||
/**
|
||||
* Initialize structural element collections.
|
||||
*/
|
||||
protected function initializeStructuralElement(): void
|
||||
{
|
||||
$this->children = new ArrayCollection();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this element is a child of another element (recursive).
|
||||
*
|
||||
* @param self $another_element the object to compare
|
||||
* IMPORTANT: both objects to compare must be from the same class (for example two "Device" objects)!
|
||||
*
|
||||
* @return bool true, if this element is child of $another_element
|
||||
*
|
||||
* @throws InvalidArgumentException if there was an error
|
||||
*/
|
||||
public function isChildOf(self $another_element): bool
|
||||
{
|
||||
$class_name = static::class;
|
||||
|
||||
//Check if both elements compared, are from the same type
|
||||
// (we have to check inheritance, or we get exceptions when using doctrine entities (they have a proxy type):
|
||||
if (!$another_element instanceof $class_name && !is_a($this, $another_element::class)) {
|
||||
throw new InvalidArgumentException('isChildOf() only works for objects of the same type!');
|
||||
}
|
||||
|
||||
if (!$this->getParent() instanceof self) { // this is the root node
|
||||
return false;
|
||||
}
|
||||
|
||||
//If the parent element is equal to the element we want to compare, return true
|
||||
if ($this->getParent()->getID() === null) {
|
||||
//If the IDs are not yet defined, we have to compare the objects itself
|
||||
if ($this->getParent() === $another_element) {
|
||||
return true;
|
||||
}
|
||||
} elseif ($this->getParent()->getID() === $another_element->getID()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
//Otherwise, check recursively
|
||||
return $this->parent->isChildOf($another_element);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this element is a root element (has no parent).
|
||||
*
|
||||
* @return bool true if this element is a root element
|
||||
*/
|
||||
public function isRoot(): bool
|
||||
{
|
||||
return $this->parent === null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parent of this element.
|
||||
*
|
||||
* @return static|null The parent element. Null if this element does not have a parent.
|
||||
*/
|
||||
public function getParent(): ?self
|
||||
{
|
||||
return $this->parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the comment of the element as markdown encoded string.
|
||||
*
|
||||
* @return string|null the comment
|
||||
*/
|
||||
public function getComment(): ?string
|
||||
{
|
||||
return $this->comment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the comment.
|
||||
*
|
||||
* @param string $new_comment the new comment
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setComment(string $new_comment): self
|
||||
{
|
||||
$this->comment = $new_comment;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the level.
|
||||
*
|
||||
* The level of the root node is -1.
|
||||
*
|
||||
* @return int the level of this element (zero means the topmost element
|
||||
* [a sub element of the root node])
|
||||
*/
|
||||
public function getLevel(): int
|
||||
{
|
||||
/*
|
||||
* Only check for nodes that have a parent. In the other cases zero is correct.
|
||||
*/
|
||||
if (0 === $this->level && $this->parent instanceof self) {
|
||||
$element = $this->parent;
|
||||
while ($element instanceof self) {
|
||||
$element = $element->parent;
|
||||
++$this->level;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->level;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the full path.
|
||||
*
|
||||
* @param string $delimiter the delimiter of the returned string
|
||||
*
|
||||
* @return string the full path (incl. the name of this element), delimited by $delimiter
|
||||
*/
|
||||
#[Groups(['api:basic:read'])]
|
||||
#[SerializedName('full_path')]
|
||||
public function getFullPath(string $delimiter = self::PATH_DELIMITER_ARROW): string
|
||||
{
|
||||
if ($this->full_path_strings === []) {
|
||||
$this->full_path_strings = [];
|
||||
$this->full_path_strings[] = $this->getName();
|
||||
$element = $this;
|
||||
|
||||
$overflow = 20; //We only allow 20 levels depth
|
||||
|
||||
while ($element->parent instanceof self && $overflow >= 0) {
|
||||
$element = $element->parent;
|
||||
$this->full_path_strings[] = $element->getName();
|
||||
//Decrement to prevent mem overflow.
|
||||
--$overflow;
|
||||
}
|
||||
|
||||
$this->full_path_strings = array_reverse($this->full_path_strings);
|
||||
}
|
||||
|
||||
return implode($delimiter, $this->full_path_strings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the path to this element (including the element itself).
|
||||
*
|
||||
* @return self[] An array with all (recursively) parent elements (including this one),
|
||||
* ordered from the lowest levels (root node) first to the highest level (the element itself)
|
||||
*/
|
||||
public function getPathArray(): array
|
||||
{
|
||||
$tmp = [];
|
||||
$tmp[] = $this;
|
||||
|
||||
//We only allow 20 levels depth
|
||||
while (!end($tmp)->isRoot() && count($tmp) < 20) {
|
||||
$tmp[] = end($tmp)->parent;
|
||||
}
|
||||
|
||||
return array_reverse($tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all sub elements of this element.
|
||||
*
|
||||
* @return Collection<static>|iterable all subelements as an array of objects (sorted by their full path)
|
||||
*/
|
||||
public function getSubelements(): iterable
|
||||
{
|
||||
//If the parent is equal to this object, we would get an endless loop, so just return an empty array
|
||||
//This is just a workaround, as validator should prevent this behaviour, before it gets written to the database
|
||||
if ($this->parent === $this) {
|
||||
return new ArrayCollection();
|
||||
}
|
||||
|
||||
return $this->children ?? new ArrayCollection();
|
||||
}
|
||||
|
||||
/**
|
||||
* @see getSubelements()
|
||||
* @return Collection<static>|iterable
|
||||
*/
|
||||
public function getChildren(): iterable
|
||||
{
|
||||
return $this->getSubelements();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the new parent object.
|
||||
*
|
||||
* @param static|null $new_parent The new parent object
|
||||
* @return $this
|
||||
*/
|
||||
public function setParent(?self $new_parent): self
|
||||
{
|
||||
$this->parent = $new_parent;
|
||||
|
||||
//Add this element as child to the new parent
|
||||
if ($new_parent instanceof self) {
|
||||
$new_parent->getChildren()->add($this);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the given element as child to this element.
|
||||
* @param static $child
|
||||
* @return $this
|
||||
*/
|
||||
public function addChild(self $child): self
|
||||
{
|
||||
$this->children->add($child);
|
||||
//Children get this element as parent
|
||||
$child->setParent($this);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the given element as child from this element.
|
||||
* @param static $child
|
||||
* @return $this
|
||||
*/
|
||||
public function removeChild(self $child): self
|
||||
{
|
||||
$this->children->removeElement($child);
|
||||
//Children has no parent anymore
|
||||
$child->setParent(null);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function isNotSelectable(): bool
|
||||
{
|
||||
return $this->not_selectable;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setNotSelectable(bool $not_selectable): self
|
||||
{
|
||||
$this->not_selectable = $not_selectable;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function clearChildren(): self
|
||||
{
|
||||
$this->children = new ArrayCollection();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a comma separated list of alternative names.
|
||||
* @return string|null
|
||||
*/
|
||||
public function getAlternativeNames(): ?string
|
||||
{
|
||||
if ($this->alternative_names === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
//Remove trailing comma
|
||||
return rtrim($this->alternative_names, ',');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a comma separated list of alternative names.
|
||||
* @return $this
|
||||
*/
|
||||
public function setAlternativeNames(?string $new_value): self
|
||||
{
|
||||
//Add a trailing comma, if not already there (makes it easier to find in the database)
|
||||
if (is_string($new_value) && !str_ends_with($new_value, ',')) {
|
||||
$new_value .= ',';
|
||||
}
|
||||
|
||||
$this->alternative_names = $new_value;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Entity\Contracts;
|
||||
|
||||
/**
|
||||
* Interface for company entities (suppliers, manufacturers).
|
||||
*/
|
||||
interface CompanyInterface
|
||||
{
|
||||
/**
|
||||
* Get the address.
|
||||
*
|
||||
* @return string the address of the company (with "\n" as line break)
|
||||
*/
|
||||
public function getAddress(): string;
|
||||
|
||||
/**
|
||||
* Get the phone number.
|
||||
*
|
||||
* @return string the phone number of the company
|
||||
*/
|
||||
public function getPhoneNumber(): string;
|
||||
|
||||
/**
|
||||
* Get the e-mail address.
|
||||
*
|
||||
* @return string the e-mail address of the company
|
||||
*/
|
||||
public function getEmailAddress(): string;
|
||||
|
||||
/**
|
||||
* Get the website.
|
||||
*
|
||||
* @return string the website of the company
|
||||
*/
|
||||
public function getWebsite(): string;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Entity\Contracts;
|
||||
|
||||
/**
|
||||
* Interface for entities that have a database ID.
|
||||
*/
|
||||
interface DBElementInterface
|
||||
{
|
||||
/**
|
||||
* Get the ID. The ID can be zero, or even negative (for virtual elements).
|
||||
*
|
||||
* Returns null, if the element is not saved to the DB yet.
|
||||
*
|
||||
* @return int|null the ID of this element
|
||||
*/
|
||||
public function getID(): ?int;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Entity\Contracts;
|
||||
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
|
||||
/**
|
||||
* Interface for entities that have parameters.
|
||||
*/
|
||||
interface HasParametersInterface
|
||||
{
|
||||
/**
|
||||
* Return all associated parameters.
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
public function getParameters(): Collection;
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Entity\Contracts;
|
||||
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
|
||||
/**
|
||||
* Interface for structural elements that form a tree hierarchy.
|
||||
*/
|
||||
interface StructuralElementInterface
|
||||
{
|
||||
/**
|
||||
* Get the parent of this element.
|
||||
*
|
||||
* @return static|null The parent element. Null if this element does not have a parent.
|
||||
*/
|
||||
public function getParent(): ?self;
|
||||
|
||||
/**
|
||||
* Get all sub elements of this element.
|
||||
*
|
||||
* @return Collection<static>|iterable all subelements
|
||||
*/
|
||||
public function getChildren(): iterable;
|
||||
|
||||
/**
|
||||
* Checks if this element is a root element (has no parent).
|
||||
*
|
||||
* @return bool true if this element is a root element
|
||||
*/
|
||||
public function isRoot(): bool;
|
||||
|
||||
/**
|
||||
* Get the full path.
|
||||
*
|
||||
* @param string $delimiter the delimiter of the returned string
|
||||
*
|
||||
* @return string the full path (incl. the name of this element), delimited by $delimiter
|
||||
*/
|
||||
public function getFullPath(string $delimiter = ' → '): string;
|
||||
|
||||
/**
|
||||
* Get the level.
|
||||
*
|
||||
* The level of the root node is -1.
|
||||
*
|
||||
* @return int the level of this element (zero means the topmost element)
|
||||
*/
|
||||
public function getLevel(): int;
|
||||
}
|
||||
@@ -39,44 +39,28 @@ use ApiPlatform\OpenApi\Model\Operation;
|
||||
use ApiPlatform\Serializer\Filter\PropertyFilter;
|
||||
use App\ApiPlatform\Filter\LikeFilter;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Base\AttachmentsTrait;
|
||||
use App\Entity\Base\DBElementTrait;
|
||||
use App\Entity\Base\MasterAttachmentTrait;
|
||||
use App\Entity\Base\NamedElementTrait;
|
||||
use App\Entity\Base\StructuralElementTrait;
|
||||
use App\Entity\Base\TimestampTrait;
|
||||
use App\Entity\Contracts\DBElementInterface;
|
||||
use App\Entity\Contracts\HasAttachmentsInterface;
|
||||
use App\Entity\Contracts\HasMasterAttachmentInterface;
|
||||
use App\Entity\Contracts\HasParametersInterface;
|
||||
use App\Entity\Contracts\NamedElementInterface;
|
||||
use App\Entity\Contracts\StructuralElementInterface;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use App\Entity\EDA\EDACategoryInfo;
|
||||
use App\Entity\Parameters\ParametersTrait;
|
||||
use App\EntityListeners\TreeCacheInvalidationListener;
|
||||
use App\Repository\Parts\CategoryRepository;
|
||||
use App\Validator\Constraints\UniqueObjectCollection;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use App\Entity\Attachments\CategoryAttachment;
|
||||
use App\Entity\Base\AbstractPartsContainingDBElement;
|
||||
use App\Entity\Base\AbstractStructuralDBElement;
|
||||
use App\Entity\Parameters\CategoryParameter;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
/**
|
||||
* This entity describes a category, a part can belong to, which is used to group parts by their function.
|
||||
*
|
||||
* @extends AbstractPartsContainingDBElement<CategoryAttachment, CategoryParameter>
|
||||
*/
|
||||
#[ORM\Entity(repositoryClass: CategoryRepository::class)]
|
||||
#[ORM\Table(name: '`categories`')]
|
||||
#[ORM\Index(columns: ['name'], name: 'category_idx_name')]
|
||||
#[ORM\Index(columns: ['parent_id', 'name'], name: 'category_idx_parent_name')]
|
||||
#[ORM\HasLifecycleCallbacks]
|
||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||
#[UniqueEntity(fields: ['name', 'parent'], message: 'structural.entity.unique_name', ignoreNull: false)]
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new Get(security: 'is_granted("read", object)'),
|
||||
@@ -105,16 +89,8 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
#[ApiFilter(LikeFilter::class, properties: ["name", "comment"])]
|
||||
#[ApiFilter(DateFilter::class, strategy: DateFilterInterface::EXCLUDE_NULL)]
|
||||
#[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])]
|
||||
class Category implements DBElementInterface, NamedElementInterface, TimeStampableInterface, HasAttachmentsInterface, HasMasterAttachmentInterface, StructuralElementInterface, HasParametersInterface, \Stringable, \JsonSerializable
|
||||
class Category extends AbstractPartsContainingDBElement
|
||||
{
|
||||
use DBElementTrait;
|
||||
use NamedElementTrait;
|
||||
use TimestampTrait;
|
||||
use AttachmentsTrait;
|
||||
use MasterAttachmentTrait;
|
||||
use StructuralElementTrait;
|
||||
use ParametersTrait;
|
||||
|
||||
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class)]
|
||||
#[ORM\OrderBy(['name' => Criteria::ASC])]
|
||||
protected Collection $children;
|
||||
@@ -123,7 +99,7 @@ class Category implements DBElementInterface, NamedElementInterface, TimeStampab
|
||||
#[ORM\JoinColumn(name: 'parent_id')]
|
||||
#[Groups(['category:read', 'category:write'])]
|
||||
#[ApiProperty(readableLink: false, writableLink: false)]
|
||||
protected ?self $parent = null;
|
||||
protected ?AbstractStructuralDBElement $parent = null;
|
||||
|
||||
#[Groups(['category:read', 'category:write'])]
|
||||
protected string $comment = '';
|
||||
@@ -208,7 +184,6 @@ class Category implements DBElementInterface, NamedElementInterface, TimeStampab
|
||||
/** @var Collection<int, CategoryParameter>
|
||||
*/
|
||||
#[Assert\Valid]
|
||||
#[UniqueObjectCollection(fields: ['name', 'group', 'element'])]
|
||||
#[Groups(['full', 'category:read', 'category:write'])]
|
||||
#[ORM\OneToMany(mappedBy: 'element', targetEntity: CategoryParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||
#[ORM\OrderBy(['group' => Criteria::ASC, 'name' => 'ASC'])]
|
||||
@@ -226,37 +201,13 @@ class Category implements DBElementInterface, NamedElementInterface, TimeStampab
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->initializeAttachments();
|
||||
$this->initializeStructuralElement();
|
||||
parent::__construct();
|
||||
$this->children = new ArrayCollection();
|
||||
$this->attachments = new ArrayCollection();
|
||||
$this->parameters = new ArrayCollection();
|
||||
$this->eda_info = new EDACategoryInfo();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
if ($this->id) {
|
||||
$this->cloneDBElement();
|
||||
$this->cloneAttachments();
|
||||
|
||||
// We create a new object, so give it a new creation date
|
||||
$this->addedDate = null;
|
||||
|
||||
//Deep clone parameters
|
||||
$parameters = $this->parameters;
|
||||
$this->parameters = new ArrayCollection();
|
||||
foreach ($parameters as $parameter) {
|
||||
$this->addParameter(clone $parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return ['@id' => $this->getID()];
|
||||
}
|
||||
|
||||
public function getPartnameHint(): string
|
||||
{
|
||||
return $this->partname_hint;
|
||||
|
||||
@@ -39,43 +39,27 @@ use ApiPlatform\OpenApi\Model\Operation;
|
||||
use ApiPlatform\Serializer\Filter\PropertyFilter;
|
||||
use App\ApiPlatform\Filter\LikeFilter;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Base\AttachmentsTrait;
|
||||
use App\Entity\Base\DBElementTrait;
|
||||
use App\Entity\Base\MasterAttachmentTrait;
|
||||
use App\Entity\Base\NamedElementTrait;
|
||||
use App\Entity\Base\StructuralElementTrait;
|
||||
use App\Entity\Base\TimestampTrait;
|
||||
use App\Entity\Contracts\DBElementInterface;
|
||||
use App\Entity\Contracts\HasAttachmentsInterface;
|
||||
use App\Entity\Contracts\HasMasterAttachmentInterface;
|
||||
use App\Entity\Contracts\HasParametersInterface;
|
||||
use App\Entity\Contracts\NamedElementInterface;
|
||||
use App\Entity\Contracts\StructuralElementInterface;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use App\Entity\EDA\EDAFootprintInfo;
|
||||
use App\Entity\Parameters\ParametersTrait;
|
||||
use App\EntityListeners\TreeCacheInvalidationListener;
|
||||
use App\Repository\Parts\FootprintRepository;
|
||||
use App\Validator\Constraints\UniqueObjectCollection;
|
||||
use App\Entity\Base\AbstractStructuralDBElement;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use App\Entity\Attachments\FootprintAttachment;
|
||||
use App\Entity\Base\AbstractPartsContainingDBElement;
|
||||
use App\Entity\Parameters\FootprintParameter;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
/**
|
||||
* This entity represents a footprint of a part (its physical dimensions and shape).
|
||||
*
|
||||
* @extends AbstractPartsContainingDBElement<FootprintAttachment, FootprintParameter>
|
||||
*/
|
||||
#[ORM\Entity(repositoryClass: FootprintRepository::class)]
|
||||
#[ORM\Table('`footprints`')]
|
||||
#[ORM\Index(columns: ['name'], name: 'footprint_idx_name')]
|
||||
#[ORM\Index(columns: ['parent_id', 'name'], name: 'footprint_idx_parent_name')]
|
||||
#[ORM\HasLifecycleCallbacks]
|
||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||
#[UniqueEntity(fields: ['name', 'parent'], message: 'structural.entity.unique_name', ignoreNull: false)]
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new Get(security: 'is_granted("read", object)'),
|
||||
@@ -104,21 +88,13 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
#[ApiFilter(LikeFilter::class, properties: ["name", "comment"])]
|
||||
#[ApiFilter(DateFilter::class, strategy: DateFilterInterface::EXCLUDE_NULL)]
|
||||
#[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])]
|
||||
class Footprint implements DBElementInterface, NamedElementInterface, TimeStampableInterface, HasAttachmentsInterface, HasMasterAttachmentInterface, StructuralElementInterface, HasParametersInterface, \Stringable, \JsonSerializable
|
||||
class Footprint extends AbstractPartsContainingDBElement
|
||||
{
|
||||
use DBElementTrait;
|
||||
use NamedElementTrait;
|
||||
use TimestampTrait;
|
||||
use AttachmentsTrait;
|
||||
use MasterAttachmentTrait;
|
||||
use StructuralElementTrait;
|
||||
use ParametersTrait;
|
||||
|
||||
#[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'children')]
|
||||
#[ORM\JoinColumn(name: 'parent_id')]
|
||||
#[Groups(['footprint:read', 'footprint:write'])]
|
||||
#[ApiProperty(readableLink: false, writableLink: false)]
|
||||
protected ?self $parent = null;
|
||||
protected ?AbstractStructuralDBElement $parent = null;
|
||||
|
||||
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class)]
|
||||
#[ORM\OrderBy(['name' => Criteria::ASC])]
|
||||
@@ -152,7 +128,6 @@ class Footprint implements DBElementInterface, NamedElementInterface, TimeStampa
|
||||
/** @var Collection<int, FootprintParameter>
|
||||
*/
|
||||
#[Assert\Valid]
|
||||
#[UniqueObjectCollection(fields: ['name', 'group', 'element'])]
|
||||
#[ORM\OneToMany(mappedBy: 'element', targetEntity: FootprintParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||
#[ORM\OrderBy(['group' => Criteria::ASC, 'name' => 'ASC'])]
|
||||
#[Groups(['footprint:read', 'footprint:write'])]
|
||||
@@ -170,37 +145,13 @@ class Footprint implements DBElementInterface, NamedElementInterface, TimeStampa
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->initializeAttachments();
|
||||
$this->initializeStructuralElement();
|
||||
parent::__construct();
|
||||
$this->children = new ArrayCollection();
|
||||
$this->attachments = new ArrayCollection();
|
||||
$this->parameters = new ArrayCollection();
|
||||
$this->eda_info = new EDAFootprintInfo();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
if ($this->id) {
|
||||
$this->cloneDBElement();
|
||||
$this->cloneAttachments();
|
||||
|
||||
// We create a new object, so give it a new creation date
|
||||
$this->addedDate = null;
|
||||
|
||||
//Deep clone parameters
|
||||
$parameters = $this->parameters;
|
||||
$this->parameters = new ArrayCollection();
|
||||
foreach ($parameters as $parameter) {
|
||||
$this->addParameter(clone $parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return ['@id' => $this->getID()];
|
||||
}
|
||||
|
||||
/****************************************
|
||||
* Getters
|
||||
****************************************/
|
||||
|
||||
@@ -39,44 +39,26 @@ use ApiPlatform\OpenApi\Model\Operation;
|
||||
use ApiPlatform\Serializer\Filter\PropertyFilter;
|
||||
use App\ApiPlatform\Filter\LikeFilter;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Base\AttachmentsTrait;
|
||||
use App\Entity\Base\CompanyTrait;
|
||||
use App\Entity\Base\DBElementTrait;
|
||||
use App\Entity\Base\MasterAttachmentTrait;
|
||||
use App\Entity\Base\NamedElementTrait;
|
||||
use App\Entity\Base\StructuralElementTrait;
|
||||
use App\Entity\Base\TimestampTrait;
|
||||
use App\Entity\Contracts\CompanyInterface;
|
||||
use App\Entity\Contracts\DBElementInterface;
|
||||
use App\Entity\Contracts\HasAttachmentsInterface;
|
||||
use App\Entity\Contracts\HasMasterAttachmentInterface;
|
||||
use App\Entity\Contracts\HasParametersInterface;
|
||||
use App\Entity\Contracts\NamedElementInterface;
|
||||
use App\Entity\Contracts\StructuralElementInterface;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use App\Entity\Parameters\ParametersTrait;
|
||||
use App\EntityListeners\TreeCacheInvalidationListener;
|
||||
use App\Repository\Parts\ManufacturerRepository;
|
||||
use App\Validator\Constraints\UniqueObjectCollection;
|
||||
use App\Entity\Base\AbstractStructuralDBElement;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use App\Entity\Attachments\ManufacturerAttachment;
|
||||
use App\Entity\Base\AbstractCompany;
|
||||
use App\Entity\Parameters\ManufacturerParameter;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
/**
|
||||
* This entity represents a manufacturer of a part (The company that produces the part).
|
||||
*
|
||||
* @extends AbstractCompany<ManufacturerAttachment, ManufacturerParameter>
|
||||
*/
|
||||
#[ORM\Entity(repositoryClass: ManufacturerRepository::class)]
|
||||
#[ORM\Table('`manufacturers`')]
|
||||
#[ORM\Index(columns: ['name'], name: 'manufacturer_name')]
|
||||
#[ORM\Index(columns: ['parent_id', 'name'], name: 'manufacturer_idx_parent_name')]
|
||||
#[ORM\HasLifecycleCallbacks]
|
||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||
#[UniqueEntity(fields: ['name', 'parent'], message: 'structural.entity.unique_name', ignoreNull: false)]
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new Get(security: 'is_granted("read", object)'),
|
||||
@@ -105,22 +87,13 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
#[ApiFilter(LikeFilter::class, properties: ["name", "comment"])]
|
||||
#[ApiFilter(DateFilter::class, strategy: DateFilterInterface::EXCLUDE_NULL)]
|
||||
#[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])]
|
||||
class Manufacturer implements DBElementInterface, NamedElementInterface, TimeStampableInterface, HasAttachmentsInterface, HasMasterAttachmentInterface, StructuralElementInterface, HasParametersInterface, CompanyInterface, \Stringable, \JsonSerializable
|
||||
class Manufacturer extends AbstractCompany
|
||||
{
|
||||
use DBElementTrait;
|
||||
use NamedElementTrait;
|
||||
use TimestampTrait;
|
||||
use AttachmentsTrait;
|
||||
use MasterAttachmentTrait;
|
||||
use StructuralElementTrait;
|
||||
use ParametersTrait;
|
||||
use CompanyTrait;
|
||||
|
||||
#[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'children')]
|
||||
#[ORM\JoinColumn(name: 'parent_id')]
|
||||
#[Groups(['manufacturer:read', 'manufacturer:write'])]
|
||||
#[ApiProperty(readableLink: false, writableLink: false)]
|
||||
protected ?self $parent = null;
|
||||
protected ?AbstractStructuralDBElement $parent = null;
|
||||
|
||||
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class)]
|
||||
#[ORM\OrderBy(['name' => Criteria::ASC])]
|
||||
@@ -145,50 +118,16 @@ class Manufacturer implements DBElementInterface, NamedElementInterface, TimeSta
|
||||
/** @var Collection<int, ManufacturerParameter>
|
||||
*/
|
||||
#[Assert\Valid]
|
||||
#[UniqueObjectCollection(fields: ['name', 'group', 'element'])]
|
||||
#[ORM\OneToMany(mappedBy: 'element', targetEntity: ManufacturerParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||
#[ORM\OrderBy(['group' => Criteria::ASC, 'name' => 'ASC'])]
|
||||
#[Groups(['manufacturer:read', 'manufacturer:write'])]
|
||||
#[ApiProperty(readableLink: false, writableLink: true)]
|
||||
protected Collection $parameters;
|
||||
|
||||
#[Groups(['manufacturer:read', 'manufacturer:write'])]
|
||||
protected string $comment = '';
|
||||
|
||||
#[Groups(['manufacturer:read'])]
|
||||
protected ?\DateTimeImmutable $addedDate = null;
|
||||
#[Groups(['manufacturer:read'])]
|
||||
protected ?\DateTimeImmutable $lastModified = null;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->initializeAttachments();
|
||||
$this->initializeStructuralElement();
|
||||
parent::__construct();
|
||||
$this->children = new ArrayCollection();
|
||||
$this->attachments = new ArrayCollection();
|
||||
$this->parameters = new ArrayCollection();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
if ($this->id) {
|
||||
$this->cloneDBElement();
|
||||
$this->cloneAttachments();
|
||||
|
||||
// We create a new object, so give it a new creation date
|
||||
$this->addedDate = null;
|
||||
|
||||
//Deep clone parameters
|
||||
$parameters = $this->parameters;
|
||||
$this->parameters = new ArrayCollection();
|
||||
foreach ($parameters as $parameter) {
|
||||
$this->addParameter(clone $parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return ['@id' => $this->getID()];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,26 +39,12 @@ use ApiPlatform\OpenApi\Model\Operation;
|
||||
use ApiPlatform\Serializer\Filter\PropertyFilter;
|
||||
use App\ApiPlatform\Filter\LikeFilter;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Base\AttachmentsTrait;
|
||||
use App\Entity\Base\DBElementTrait;
|
||||
use App\Entity\Base\MasterAttachmentTrait;
|
||||
use App\Entity\Base\NamedElementTrait;
|
||||
use App\Entity\Base\StructuralElementTrait;
|
||||
use App\Entity\Base\TimestampTrait;
|
||||
use App\Entity\Contracts\DBElementInterface;
|
||||
use App\Entity\Contracts\HasAttachmentsInterface;
|
||||
use App\Entity\Contracts\HasMasterAttachmentInterface;
|
||||
use App\Entity\Contracts\HasParametersInterface;
|
||||
use App\Entity\Contracts\NamedElementInterface;
|
||||
use App\Entity\Contracts\StructuralElementInterface;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use App\Entity\Parameters\ParametersTrait;
|
||||
use App\EntityListeners\TreeCacheInvalidationListener;
|
||||
use App\Repository\Parts\MeasurementUnitRepository;
|
||||
use App\Validator\Constraints\UniqueObjectCollection;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use App\Entity\Base\AbstractStructuralDBElement;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use App\Entity\Attachments\MeasurementUnitAttachment;
|
||||
use App\Entity\Base\AbstractPartsContainingDBElement;
|
||||
use App\Entity\Parameters\MeasurementUnitParameter;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
@@ -70,15 +56,14 @@ use Symfony\Component\Validator\Constraints\Length;
|
||||
/**
|
||||
* This unit represents the unit in which the amount of parts in stock are measured.
|
||||
* This could be something like N, grams, meters, etc...
|
||||
*
|
||||
* @extends AbstractPartsContainingDBElement<MeasurementUnitAttachment,MeasurementUnitParameter>
|
||||
*/
|
||||
#[UniqueEntity('unit')]
|
||||
#[ORM\Entity(repositoryClass: MeasurementUnitRepository::class)]
|
||||
#[ORM\Table(name: '`measurement_units`')]
|
||||
#[ORM\Index(columns: ['name'], name: 'unit_idx_name')]
|
||||
#[ORM\Index(columns: ['parent_id', 'name'], name: 'unit_idx_parent_name')]
|
||||
#[ORM\HasLifecycleCallbacks]
|
||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||
#[UniqueEntity(fields: ['name', 'parent'], message: 'structural.entity.unique_name', ignoreNull: false)]
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new Get(security: 'is_granted("read", object)'),
|
||||
@@ -107,15 +92,8 @@ use Symfony\Component\Validator\Constraints\Length;
|
||||
#[ApiFilter(LikeFilter::class, properties: ["name", "comment", "unit"])]
|
||||
#[ApiFilter(DateFilter::class, strategy: DateFilterInterface::EXCLUDE_NULL)]
|
||||
#[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])]
|
||||
class MeasurementUnit implements DBElementInterface, NamedElementInterface, TimeStampableInterface, HasAttachmentsInterface, HasMasterAttachmentInterface, StructuralElementInterface, HasParametersInterface, \Stringable, \JsonSerializable
|
||||
class MeasurementUnit extends AbstractPartsContainingDBElement
|
||||
{
|
||||
use DBElementTrait;
|
||||
use NamedElementTrait;
|
||||
use TimestampTrait;
|
||||
use AttachmentsTrait;
|
||||
use MasterAttachmentTrait;
|
||||
use StructuralElementTrait;
|
||||
use ParametersTrait;
|
||||
/**
|
||||
* @var string The unit symbol that should be used for the Unit. This could be something like "", g (for grams)
|
||||
* or m (for meters).
|
||||
@@ -153,7 +131,7 @@ class MeasurementUnit implements DBElementInterface, NamedElementInterface, Time
|
||||
#[ORM\JoinColumn(name: 'parent_id')]
|
||||
#[Groups(['measurement_unit:read', 'measurement_unit:write'])]
|
||||
#[ApiProperty(readableLink: false, writableLink: false)]
|
||||
protected ?self $parent = null;
|
||||
protected ?AbstractStructuralDBElement $parent = null;
|
||||
|
||||
/**
|
||||
* @var Collection<int, MeasurementUnitAttachment>
|
||||
@@ -172,7 +150,6 @@ class MeasurementUnit implements DBElementInterface, NamedElementInterface, Time
|
||||
/** @var Collection<int, MeasurementUnitParameter>
|
||||
*/
|
||||
#[Assert\Valid]
|
||||
#[UniqueObjectCollection(fields: ['name', 'group', 'element'])]
|
||||
#[ORM\OneToMany(mappedBy: 'element', targetEntity: MeasurementUnitParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||
#[ORM\OrderBy(['group' => Criteria::ASC, 'name' => 'ASC'])]
|
||||
#[Groups(['measurement_unit:read', 'measurement_unit:write'])]
|
||||
@@ -224,33 +201,9 @@ class MeasurementUnit implements DBElementInterface, NamedElementInterface, Time
|
||||
}
|
||||
public function __construct()
|
||||
{
|
||||
$this->initializeAttachments();
|
||||
$this->initializeStructuralElement();
|
||||
parent::__construct();
|
||||
$this->children = new ArrayCollection();
|
||||
$this->attachments = new ArrayCollection();
|
||||
$this->parameters = new ArrayCollection();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
if ($this->id) {
|
||||
$this->cloneDBElement();
|
||||
$this->cloneAttachments();
|
||||
|
||||
// We create a new object, so give it a new creation date
|
||||
$this->addedDate = null;
|
||||
|
||||
//Deep clone parameters
|
||||
$parameters = $this->parameters;
|
||||
$this->parameters = new ArrayCollection();
|
||||
foreach ($parameters as $parameter) {
|
||||
$this->addParameter(clone $parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return ['@id' => $this->getID()];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,42 +37,26 @@ use ApiPlatform\Metadata\Patch;
|
||||
use ApiPlatform\Metadata\Post;
|
||||
use ApiPlatform\Serializer\Filter\PropertyFilter;
|
||||
use App\ApiPlatform\Filter\LikeFilter;
|
||||
use App\Entity\Base\AttachmentsTrait;
|
||||
use App\Entity\Base\DBElementTrait;
|
||||
use App\Entity\Base\MasterAttachmentTrait;
|
||||
use App\Entity\Base\NamedElementTrait;
|
||||
use App\Entity\Base\StructuralElementTrait;
|
||||
use App\Entity\Base\TimestampTrait;
|
||||
use App\Entity\Contracts\DBElementInterface;
|
||||
use App\Entity\Contracts\HasAttachmentsInterface;
|
||||
use App\Entity\Contracts\HasMasterAttachmentInterface;
|
||||
use App\Entity\Contracts\HasParametersInterface;
|
||||
use App\Entity\Contracts\NamedElementInterface;
|
||||
use App\Entity\Contracts\StructuralElementInterface;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use App\Entity\Base\AbstractPartsContainingDBElement;
|
||||
use App\Entity\Base\AbstractStructuralDBElement;
|
||||
use App\Entity\Parameters\PartCustomStateParameter;
|
||||
use App\Entity\Parameters\ParametersTrait;
|
||||
use App\EntityListeners\TreeCacheInvalidationListener;
|
||||
use App\Repository\Parts\PartCustomStateRepository;
|
||||
use App\Validator\Constraints\UniqueObjectCollection;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\Common\Collections\Criteria;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
/**
|
||||
* This entity represents a custom part state.
|
||||
* If an organisation uses Part-DB and has its custom part states, this is useful.
|
||||
*
|
||||
* @extends AbstractPartsContainingDBElement<PartCustomStateAttachment,PartCustomStateParameter>
|
||||
*/
|
||||
#[ORM\Entity(repositoryClass: PartCustomStateRepository::class)]
|
||||
#[ORM\Table('`part_custom_states`')]
|
||||
#[ORM\Index(columns: ['name'], name: 'part_custom_state_name')]
|
||||
#[ORM\HasLifecycleCallbacks]
|
||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||
#[UniqueEntity(fields: ['name', 'parent'], message: 'structural.entity.unique_name', ignoreNull: false)]
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new Get(security: 'is_granted("read", object)'),
|
||||
@@ -88,16 +72,8 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
#[ApiFilter(LikeFilter::class, properties: ["name"])]
|
||||
#[ApiFilter(DateFilter::class, strategy: DateFilterInterface::EXCLUDE_NULL)]
|
||||
#[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])]
|
||||
class PartCustomState implements DBElementInterface, NamedElementInterface, TimeStampableInterface, HasAttachmentsInterface, HasMasterAttachmentInterface, StructuralElementInterface, HasParametersInterface, \Stringable, \JsonSerializable
|
||||
class PartCustomState extends AbstractPartsContainingDBElement
|
||||
{
|
||||
use DBElementTrait;
|
||||
use NamedElementTrait;
|
||||
use TimestampTrait;
|
||||
use AttachmentsTrait;
|
||||
use MasterAttachmentTrait;
|
||||
use StructuralElementTrait;
|
||||
use ParametersTrait;
|
||||
|
||||
/**
|
||||
* @var string The comment info for this element as markdown
|
||||
*/
|
||||
@@ -112,7 +88,7 @@ class PartCustomState implements DBElementInterface, NamedElementInterface, Time
|
||||
#[ORM\JoinColumn(name: 'parent_id')]
|
||||
#[Groups(['part_custom_state:read', 'part_custom_state:write'])]
|
||||
#[ApiProperty(readableLink: false, writableLink: false)]
|
||||
protected ?self $parent = null;
|
||||
protected ?AbstractStructuralDBElement $parent = null;
|
||||
|
||||
/**
|
||||
* @var Collection<int, PartCustomStateAttachment>
|
||||
@@ -131,7 +107,6 @@ class PartCustomState implements DBElementInterface, NamedElementInterface, Time
|
||||
/** @var Collection<int, PartCustomStateParameter>
|
||||
*/
|
||||
#[Assert\Valid]
|
||||
#[UniqueObjectCollection(fields: ['name', 'group', 'element'])]
|
||||
#[ORM\OneToMany(mappedBy: 'element', targetEntity: PartCustomStateParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||
#[ORM\OrderBy(['name' => 'ASC'])]
|
||||
#[Groups(['part_custom_state:read', 'part_custom_state:write'])]
|
||||
@@ -144,33 +119,9 @@ class PartCustomState implements DBElementInterface, NamedElementInterface, Time
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->initializeAttachments();
|
||||
$this->initializeStructuralElement();
|
||||
parent::__construct();
|
||||
$this->children = new ArrayCollection();
|
||||
$this->attachments = new ArrayCollection();
|
||||
$this->parameters = new ArrayCollection();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
if ($this->id) {
|
||||
$this->cloneDBElement();
|
||||
$this->cloneAttachments();
|
||||
|
||||
// We create a new object, so give it a new creation date
|
||||
$this->addedDate = null;
|
||||
|
||||
//Deep clone parameters
|
||||
$parameters = $this->parameters;
|
||||
$this->parameters = new ArrayCollection();
|
||||
foreach ($parameters as $parameter) {
|
||||
$this->addParameter(clone $parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return ['@id' => $this->getID()];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,44 +39,27 @@ use ApiPlatform\OpenApi\Model\Operation;
|
||||
use ApiPlatform\Serializer\Filter\PropertyFilter;
|
||||
use App\ApiPlatform\Filter\LikeFilter;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Base\AttachmentsTrait;
|
||||
use App\Entity\Base\DBElementTrait;
|
||||
use App\Entity\Base\MasterAttachmentTrait;
|
||||
use App\Entity\Base\NamedElementTrait;
|
||||
use App\Entity\Base\StructuralElementTrait;
|
||||
use App\Entity\Base\TimestampTrait;
|
||||
use App\Entity\Contracts\DBElementInterface;
|
||||
use App\Entity\Contracts\HasAttachmentsInterface;
|
||||
use App\Entity\Contracts\HasMasterAttachmentInterface;
|
||||
use App\Entity\Contracts\HasParametersInterface;
|
||||
use App\Entity\Contracts\NamedElementInterface;
|
||||
use App\Entity\Contracts\StructuralElementInterface;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use App\Entity\Parameters\ParametersTrait;
|
||||
use App\EntityListeners\TreeCacheInvalidationListener;
|
||||
use App\Repository\Parts\StorelocationRepository;
|
||||
use App\Validator\Constraints\UniqueObjectCollection;
|
||||
use Doctrine\DBAL\Types\Types;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use App\Entity\Attachments\StorageLocationAttachment;
|
||||
use App\Entity\Base\AbstractPartsContainingDBElement;
|
||||
use App\Entity\Base\AbstractStructuralDBElement;
|
||||
use App\Entity\Parameters\StorageLocationParameter;
|
||||
use App\Entity\UserSystem\User;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
/**
|
||||
* This entity represents a storage location, where parts can be stored.
|
||||
* @extends AbstractPartsContainingDBElement<StorageLocationAttachment, StorageLocationParameter>
|
||||
*/
|
||||
#[ORM\Entity(repositoryClass: StorelocationRepository::class)]
|
||||
#[ORM\Table('`storelocations`')]
|
||||
#[ORM\Index(columns: ['name'], name: 'location_idx_name')]
|
||||
#[ORM\Index(columns: ['parent_id', 'name'], name: 'location_idx_parent_name')]
|
||||
#[ORM\HasLifecycleCallbacks]
|
||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||
#[UniqueEntity(fields: ['name', 'parent'], message: 'structural.entity.unique_name', ignoreNull: false)]
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new Get(security: 'is_granted("read", object)'),
|
||||
@@ -105,16 +88,8 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
#[ApiFilter(LikeFilter::class, properties: ["name", "comment"])]
|
||||
#[ApiFilter(DateFilter::class, strategy: DateFilterInterface::EXCLUDE_NULL)]
|
||||
#[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])]
|
||||
class StorageLocation implements DBElementInterface, NamedElementInterface, TimeStampableInterface, HasAttachmentsInterface, HasMasterAttachmentInterface, StructuralElementInterface, HasParametersInterface, \Stringable, \JsonSerializable
|
||||
class StorageLocation extends AbstractPartsContainingDBElement
|
||||
{
|
||||
use DBElementTrait;
|
||||
use NamedElementTrait;
|
||||
use TimestampTrait;
|
||||
use AttachmentsTrait;
|
||||
use MasterAttachmentTrait;
|
||||
use StructuralElementTrait;
|
||||
use ParametersTrait;
|
||||
|
||||
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class)]
|
||||
#[ORM\OrderBy(['name' => Criteria::ASC])]
|
||||
protected Collection $children;
|
||||
@@ -123,7 +98,7 @@ class StorageLocation implements DBElementInterface, NamedElementInterface, Time
|
||||
#[ORM\JoinColumn(name: 'parent_id')]
|
||||
#[Groups(['location:read', 'location:write'])]
|
||||
#[ApiProperty(readableLink: false, writableLink: false)]
|
||||
protected ?self $parent = null;
|
||||
protected ?AbstractStructuralDBElement $parent = null;
|
||||
|
||||
#[Groups(['location:read', 'location:write'])]
|
||||
protected string $comment = '';
|
||||
@@ -139,7 +114,6 @@ class StorageLocation implements DBElementInterface, NamedElementInterface, Time
|
||||
/** @var Collection<int, StorageLocationParameter>
|
||||
*/
|
||||
#[Assert\Valid]
|
||||
#[UniqueObjectCollection(fields: ['name', 'group', 'element'])]
|
||||
#[ORM\OneToMany(mappedBy: 'element', targetEntity: StorageLocationParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||
#[ORM\OrderBy(['group' => Criteria::ASC, 'name' => 'ASC'])]
|
||||
#[Groups(['location:read', 'location:write'])]
|
||||
@@ -321,33 +295,9 @@ class StorageLocation implements DBElementInterface, NamedElementInterface, Time
|
||||
}
|
||||
public function __construct()
|
||||
{
|
||||
$this->initializeAttachments();
|
||||
$this->initializeStructuralElement();
|
||||
parent::__construct();
|
||||
$this->children = new ArrayCollection();
|
||||
$this->parameters = new ArrayCollection();
|
||||
$this->attachments = new ArrayCollection();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
if ($this->id) {
|
||||
$this->cloneDBElement();
|
||||
$this->cloneAttachments();
|
||||
|
||||
// We create a new object, so give it a new creation date
|
||||
$this->addedDate = null;
|
||||
|
||||
//Deep clone parameters
|
||||
$parameters = $this->parameters;
|
||||
$this->parameters = new ArrayCollection();
|
||||
foreach ($parameters as $parameter) {
|
||||
$this->addParameter(clone $parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return ['@id' => $this->getID()];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,28 +39,12 @@ use ApiPlatform\OpenApi\Model\Operation;
|
||||
use ApiPlatform\Serializer\Filter\PropertyFilter;
|
||||
use App\ApiPlatform\Filter\LikeFilter;
|
||||
use App\Entity\Attachments\Attachment;
|
||||
use App\Entity\Base\AttachmentsTrait;
|
||||
use App\Entity\Base\CompanyTrait;
|
||||
use App\Entity\Base\DBElementTrait;
|
||||
use App\Entity\Base\MasterAttachmentTrait;
|
||||
use App\Entity\Base\NamedElementTrait;
|
||||
use App\Entity\Base\StructuralElementTrait;
|
||||
use App\Entity\Base\TimestampTrait;
|
||||
use App\Entity\Contracts\CompanyInterface;
|
||||
use App\Entity\Contracts\DBElementInterface;
|
||||
use App\Entity\Contracts\HasAttachmentsInterface;
|
||||
use App\Entity\Contracts\HasMasterAttachmentInterface;
|
||||
use App\Entity\Contracts\HasParametersInterface;
|
||||
use App\Entity\Contracts\NamedElementInterface;
|
||||
use App\Entity\Contracts\StructuralElementInterface;
|
||||
use App\Entity\Contracts\TimeStampableInterface;
|
||||
use App\Entity\Parameters\ParametersTrait;
|
||||
use App\EntityListeners\TreeCacheInvalidationListener;
|
||||
use App\Repository\Parts\SupplierRepository;
|
||||
use App\Entity\PriceInformations\Orderdetail;
|
||||
use App\Validator\Constraints\UniqueObjectCollection;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use App\Entity\Attachments\SupplierAttachment;
|
||||
use App\Entity\Base\AbstractCompany;
|
||||
use App\Entity\Base\AbstractStructuralDBElement;
|
||||
use App\Entity\Parameters\SupplierParameter;
|
||||
use App\Entity\PriceInformations\Currency;
|
||||
use App\Validator\Constraints\BigDecimal\BigDecimalPositiveOrZero;
|
||||
@@ -68,20 +52,18 @@ use App\Validator\Constraints\Selectable;
|
||||
use Brick\Math\BigDecimal;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||
use Symfony\Component\Serializer\Annotation\Groups;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
/**
|
||||
* This entity represents a supplier of parts (the company that sells the parts).
|
||||
*
|
||||
* @extends AbstractCompany<SupplierAttachment, SupplierParameter>
|
||||
*/
|
||||
#[ORM\Entity(repositoryClass: SupplierRepository::class)]
|
||||
#[ORM\Table('`suppliers`')]
|
||||
#[ORM\Index(columns: ['name'], name: 'supplier_idx_name')]
|
||||
#[ORM\Index(columns: ['parent_id', 'name'], name: 'supplier_idx_parent_name')]
|
||||
#[ORM\HasLifecycleCallbacks]
|
||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||
#[UniqueEntity(fields: ['name', 'parent'], message: 'structural.entity.unique_name', ignoreNull: false)]
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new Get(security: 'is_granted("read", object)'),
|
||||
@@ -108,17 +90,8 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
#[ApiFilter(LikeFilter::class, properties: ["name", "comment"])]
|
||||
#[ApiFilter(DateFilter::class, strategy: DateFilterInterface::EXCLUDE_NULL)]
|
||||
#[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])]
|
||||
class Supplier implements DBElementInterface, NamedElementInterface, TimeStampableInterface, HasAttachmentsInterface, HasMasterAttachmentInterface, StructuralElementInterface, HasParametersInterface, CompanyInterface, \Stringable, \JsonSerializable
|
||||
class Supplier extends AbstractCompany
|
||||
{
|
||||
use DBElementTrait;
|
||||
use NamedElementTrait;
|
||||
use TimestampTrait;
|
||||
use AttachmentsTrait;
|
||||
use MasterAttachmentTrait;
|
||||
use StructuralElementTrait;
|
||||
use ParametersTrait;
|
||||
use CompanyTrait;
|
||||
|
||||
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class)]
|
||||
#[ORM\OrderBy(['name' => Criteria::ASC])]
|
||||
protected Collection $children;
|
||||
@@ -127,7 +100,7 @@ class Supplier implements DBElementInterface, NamedElementInterface, TimeStampab
|
||||
#[ORM\JoinColumn(name: 'parent_id')]
|
||||
#[Groups(['supplier:read', 'supplier:write'])]
|
||||
#[ApiProperty(readableLink: false, writableLink: false)]
|
||||
protected ?self $parent = null;
|
||||
protected ?AbstractStructuralDBElement $parent = null;
|
||||
|
||||
/**
|
||||
* @var Collection<int, Orderdetail>
|
||||
@@ -171,21 +144,12 @@ class Supplier implements DBElementInterface, NamedElementInterface, TimeStampab
|
||||
/** @var Collection<int, SupplierParameter>
|
||||
*/
|
||||
#[Assert\Valid]
|
||||
#[UniqueObjectCollection(fields: ['name', 'group', 'element'])]
|
||||
#[ORM\OneToMany(mappedBy: 'element', targetEntity: SupplierParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||
#[ORM\OrderBy(['group' => Criteria::ASC, 'name' => 'ASC'])]
|
||||
#[Groups(['supplier:read', 'supplier:write'])]
|
||||
#[ApiProperty(readableLink: false, writableLink: true)]
|
||||
protected Collection $parameters;
|
||||
|
||||
#[Groups(['supplier:read', 'supplier:write'])]
|
||||
protected string $comment = '';
|
||||
|
||||
#[Groups(['supplier:read'])]
|
||||
protected ?\DateTimeImmutable $addedDate = null;
|
||||
#[Groups(['supplier:read'])]
|
||||
protected ?\DateTimeImmutable $lastModified = null;
|
||||
|
||||
/**
|
||||
* Gets the currency that should be used by default, when creating a orderdetail with this supplier.
|
||||
*/
|
||||
@@ -234,34 +198,10 @@ class Supplier implements DBElementInterface, NamedElementInterface, TimeStampab
|
||||
}
|
||||
public function __construct()
|
||||
{
|
||||
$this->initializeAttachments();
|
||||
$this->initializeStructuralElement();
|
||||
parent::__construct();
|
||||
$this->children = new ArrayCollection();
|
||||
$this->orderdetails = new ArrayCollection();
|
||||
$this->attachments = new ArrayCollection();
|
||||
$this->parameters = new ArrayCollection();
|
||||
}
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
if ($this->id) {
|
||||
$this->cloneDBElement();
|
||||
$this->cloneAttachments();
|
||||
|
||||
// We create a new object, so give it a new creation date
|
||||
$this->addedDate = null;
|
||||
|
||||
//Deep clone parameters
|
||||
$parameters = $this->parameters;
|
||||
$this->parameters = new ArrayCollection();
|
||||
foreach ($parameters as $parameter) {
|
||||
$this->addParameter(clone $parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return ['@id' => $this->getID()];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ class FileTypeFilterTools
|
||||
{
|
||||
$filter = trim($filter);
|
||||
|
||||
return $this->cache->get('filter_exts_'.md5($filter), function (ItemInterface $item) use ($filter) {
|
||||
return $this->cache->get('filter_exts_'.hash('xxh3', $filter), function (ItemInterface $item) use ($filter) {
|
||||
$elements = explode(',', $filter);
|
||||
$extensions = [];
|
||||
|
||||
|
||||
@@ -39,10 +39,10 @@ class PKImportHelper
|
||||
* Existing users and groups are not purged.
|
||||
* This is needed to avoid ID collisions.
|
||||
*/
|
||||
public function purgeDatabaseForImport(): void
|
||||
public function purgeDatabaseForImport(?EntityManagerInterface $entityManager = null, array $excluded_tables = ['users', 'groups', 'u2f_keys', 'internal', 'migration_versions']): void
|
||||
{
|
||||
//We use the ResetAutoIncrementORMPurger to reset the auto increment values of the tables. Also it normalizes table names before checking for exclusion.
|
||||
$purger = new ResetAutoIncrementORMPurger($this->em, ['users', 'groups', 'u2f_keys', 'internal', 'migration_versions']);
|
||||
$purger = new ResetAutoIncrementORMPurger($entityManager ?? $this->em, $excluded_tables);
|
||||
$purger->purge();
|
||||
}
|
||||
|
||||
|
||||
639
src/Services/InfoProviderSystem/Providers/BuerklinProvider.php
Normal file
639
src/Services/InfoProviderSystem/Providers/BuerklinProvider.php
Normal file
@@ -0,0 +1,639 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2023 Jan Böhmer (https://github.com/jbtronics)
|
||||
* Copyright (C) 2025 Marc Kreidler (https://github.com/mkne)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
|
||||
namespace App\Services\InfoProviderSystem\Providers;
|
||||
|
||||
use App\Services\InfoProviderSystem\DTOs\FileDTO;
|
||||
use App\Services\InfoProviderSystem\DTOs\ParameterDTO;
|
||||
use App\Services\InfoProviderSystem\DTOs\PartDetailDTO;
|
||||
use App\Services\InfoProviderSystem\DTOs\PriceDTO;
|
||||
use App\Services\InfoProviderSystem\DTOs\PurchaseInfoDTO;
|
||||
use App\Services\InfoProviderSystem\DTOs\SearchResultDTO;
|
||||
use App\Settings\InfoProviderSystem\BuerklinSettings;
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
||||
|
||||
class BuerklinProvider implements BatchInfoProviderInterface
|
||||
{
|
||||
|
||||
private const ENDPOINT_URL = 'https://www.buerklin.com/buerklinws/v2/buerklin';
|
||||
|
||||
public const DISTRIBUTOR_NAME = 'Buerklin';
|
||||
|
||||
private const CACHE_TTL = 600;
|
||||
/**
|
||||
* Local in-request cache to avoid hitting the PSR cache repeatedly for the same product.
|
||||
* @var array<string, array>
|
||||
*/
|
||||
private array $productCache = [];
|
||||
|
||||
public function __construct(
|
||||
private readonly HttpClientInterface $client,
|
||||
private readonly CacheItemPoolInterface $partInfoCache,
|
||||
private readonly BuerklinSettings $settings,
|
||||
) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the latest OAuth token for the Buerklin API, or creates a new one if none is available
|
||||
* TODO: Rework this to use the OAuth token manager system in the database...
|
||||
* @return string
|
||||
*/
|
||||
private function getToken(): string
|
||||
{
|
||||
// Cache token to avoid hammering the auth server on every request
|
||||
$cacheKey = 'buerklin.oauth.token';
|
||||
$item = $this->partInfoCache->getItem($cacheKey);
|
||||
|
||||
if ($item->isHit()) {
|
||||
$token = $item->get();
|
||||
if (is_string($token) && $token !== '') {
|
||||
return $token;
|
||||
}
|
||||
}
|
||||
|
||||
// Buerklin OAuth2 password grant (ROPC)
|
||||
$resp = $this->client->request('POST', 'https://www.buerklin.com/authorizationserver/oauth/token/', [
|
||||
'headers' => [
|
||||
'Accept' => 'application/json',
|
||||
'Content-Type' => 'application/x-www-form-urlencoded',
|
||||
],
|
||||
'body' => [
|
||||
'grant_type' => 'password',
|
||||
'client_id' => $this->settings->clientId,
|
||||
'client_secret' => $this->settings->secret,
|
||||
'username' => $this->settings->username,
|
||||
'password' => $this->settings->password,
|
||||
],
|
||||
]);
|
||||
|
||||
$data = $resp->toArray(false);
|
||||
|
||||
if (!isset($data['access_token'])) {
|
||||
throw new \RuntimeException(
|
||||
'Invalid token response from Buerklin: HTTP ' . $resp->getStatusCode() . ' body=' . $resp->getContent(false)
|
||||
);
|
||||
}
|
||||
|
||||
$token = (string) $data['access_token'];
|
||||
|
||||
// Cache for (expires_in - 30s) if available
|
||||
$ttl = 300;
|
||||
if (isset($data['expires_in']) && is_numeric($data['expires_in'])) {
|
||||
$ttl = max(60, (int) $data['expires_in'] - 30);
|
||||
}
|
||||
|
||||
$item->set($token);
|
||||
$item->expiresAfter($ttl);
|
||||
$this->partInfoCache->save($item);
|
||||
|
||||
return $token;
|
||||
}
|
||||
|
||||
private function getDefaultQueryParams(): array
|
||||
{
|
||||
return [
|
||||
'curr' => $this->settings->currency ?: 'EUR',
|
||||
'language' => $this->settings->language ?: 'en',
|
||||
];
|
||||
}
|
||||
|
||||
private function getProduct(string $code): array
|
||||
{
|
||||
$code = strtoupper(trim($code));
|
||||
if ($code === '') {
|
||||
throw new \InvalidArgumentException('Product code must not be empty.');
|
||||
}
|
||||
|
||||
$cacheKey = sprintf(
|
||||
'buerklin.product.%s',
|
||||
md5($code . '|' . $this->settings->language . '|' . $this->settings->currency)
|
||||
);
|
||||
|
||||
if (isset($this->productCache[$cacheKey])) {
|
||||
return $this->productCache[$cacheKey];
|
||||
}
|
||||
|
||||
$item = $this->partInfoCache->getItem($cacheKey);
|
||||
if ($item->isHit() && is_array($cached = $item->get())) {
|
||||
return $this->productCache[$cacheKey] = $cached;
|
||||
}
|
||||
|
||||
$product = $this->makeAPICall('/products/' . rawurlencode($code) . '/');
|
||||
|
||||
$item->set($product);
|
||||
$item->expiresAfter(self::CACHE_TTL);
|
||||
$this->partInfoCache->save($item);
|
||||
|
||||
return $this->productCache[$cacheKey] = $product;
|
||||
}
|
||||
|
||||
private function makeAPICall(string $endpoint, array $queryParams = []): array
|
||||
{
|
||||
try {
|
||||
$response = $this->client->request('GET', self::ENDPOINT_URL . $endpoint, [
|
||||
'auth_bearer' => $this->getToken(),
|
||||
'headers' => ['Accept' => 'application/json'],
|
||||
'query' => array_merge($this->getDefaultQueryParams(), $queryParams),
|
||||
]);
|
||||
|
||||
return $response->toArray();
|
||||
} catch (\Exception $e) {
|
||||
throw new \RuntimeException("Buerklin API request failed: " .
|
||||
"Endpoint: " . $endpoint .
|
||||
"Token: [redacted] " .
|
||||
"QueryParams: " . json_encode($queryParams, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . " " .
|
||||
"Exception message: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function getProviderInfo(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'Buerklin',
|
||||
'description' => 'This provider uses the Buerklin API to search for parts.',
|
||||
'url' => 'https://www.buerklin.com/',
|
||||
'disabled_help' => 'Configure the API Client ID, Secret, Username and Password provided by Buerklin in the provider settings to enable.',
|
||||
'settings_class' => BuerklinSettings::class
|
||||
];
|
||||
}
|
||||
|
||||
public function getProviderKey(): string
|
||||
{
|
||||
return 'buerklin';
|
||||
}
|
||||
|
||||
// This provider is considered active if settings are present
|
||||
public function isActive(): bool
|
||||
{
|
||||
// The client credentials and user credentials must be set
|
||||
return $this->settings->clientId !== null && $this->settings->clientId !== ''
|
||||
&& $this->settings->secret !== null && $this->settings->secret !== ''
|
||||
&& $this->settings->username !== null && $this->settings->username !== ''
|
||||
&& $this->settings->password !== null && $this->settings->password !== '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitizes a field by removing any HTML tags and other unwanted characters
|
||||
* @param string|null $field
|
||||
* @return string|null
|
||||
*/
|
||||
private function sanitizeField(?string $field): ?string
|
||||
{
|
||||
if ($field === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return strip_tags($field);
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a deserialized JSON object of the product and returns a PartDetailDTO
|
||||
* @param array $product
|
||||
* @return PartDetailDTO
|
||||
*/
|
||||
private function getPartDetail(array $product): PartDetailDTO
|
||||
{
|
||||
// If this is a search-result object, it may not contain prices/features/images -> reload full details.
|
||||
if ((!isset($product['price']) && !isset($product['volumePrices'])) && isset($product['code'])) {
|
||||
try {
|
||||
$product = $this->getProduct((string) $product['code']);
|
||||
} catch (\Throwable $e) {
|
||||
// If reload fails, keep the partial product data and continue.
|
||||
}
|
||||
}
|
||||
|
||||
// Extract images from API response
|
||||
$productImages = $this->getProductImages($product['images'] ?? null);
|
||||
|
||||
// Set preview image
|
||||
$preview = $productImages[0]->url ?? null;
|
||||
|
||||
// Extract features (parameters) from classifications[0].features of Buerklin JSON response
|
||||
$features = $product['classifications'][0]['features'] ?? [];
|
||||
|
||||
// Feature parameters (from classifications->features)
|
||||
$featureParams = $this->attributesToParameters($features, ''); // leave group empty for normal parameters
|
||||
|
||||
// Compliance parameters (from top-level fields like RoHS/SVHC/…)
|
||||
$complianceParams = $this->complianceToParameters($product, 'Compliance');
|
||||
|
||||
// Merge all parameters
|
||||
$allParams = array_merge($featureParams, $complianceParams);
|
||||
|
||||
// Assign footprint: "Design" (en) / "Bauform" (de) / "Enclosure" (en) / "Gehäuse" (de)
|
||||
$footprint = null;
|
||||
if (is_array($features)) {
|
||||
foreach ($features as $feature) {
|
||||
$name = $feature['name'] ?? null;
|
||||
if ($name === 'Design' || $name === 'Bauform' || $name === 'Enclosure' || $name === 'Gehäuse') {
|
||||
$footprint = $feature['featureValues'][0]['value'] ?? null;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Prices: prefer volumePrices, fallback to single price
|
||||
$code = (string) ($product['orderNumber'] ?? $product['code'] ?? '');
|
||||
$prices = $product['volumePrices'] ?? null;
|
||||
|
||||
if (!is_array($prices) || count($prices) === 0) {
|
||||
$pVal = $product['price']['value'] ?? null;
|
||||
$pCur = $product['price']['currencyIso'] ?? ($this->settings->currency ?: 'EUR');
|
||||
|
||||
if (is_numeric($pVal)) {
|
||||
$prices = [
|
||||
[
|
||||
'minQuantity' => 1,
|
||||
'value' => (float) $pVal,
|
||||
'currencyIso' => (string) $pCur,
|
||||
]
|
||||
];
|
||||
} else {
|
||||
$prices = [];
|
||||
}
|
||||
}
|
||||
|
||||
return new PartDetailDTO(
|
||||
provider_key: $this->getProviderKey(),
|
||||
provider_id: (string) ($product['code'] ?? $code),
|
||||
|
||||
name: (string) ($product['manufacturerProductId'] ?? $code),
|
||||
description: $this->sanitizeField($product['description'] ?? null),
|
||||
|
||||
category: $this->sanitizeField($product['classifications'][0]['name'] ?? ($product['categories'][0]['name'] ?? null)),
|
||||
manufacturer: $this->sanitizeField($product['manufacturer'] ?? null),
|
||||
mpn: $this->sanitizeField($product['manufacturerProductId'] ?? null),
|
||||
|
||||
preview_image_url: $preview,
|
||||
manufacturing_status: null,
|
||||
|
||||
provider_url: $this->getProductShortURL((string) ($product['code'] ?? $code)),
|
||||
footprint: $footprint,
|
||||
|
||||
datasheets: null, // not found in JSON response, the Buerklin website however has links to datasheets
|
||||
images: $productImages,
|
||||
|
||||
parameters: $allParams,
|
||||
|
||||
vendor_infos: $this->pricesToVendorInfo(
|
||||
sku: $code,
|
||||
url: $this->getProductShortURL($code),
|
||||
prices: $prices
|
||||
),
|
||||
|
||||
mass: $product['weight'] ?? null,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the price array to a VendorInfoDTO array to be used in the PartDetailDTO
|
||||
* @param string $sku
|
||||
* @param string $url
|
||||
* @param array $prices
|
||||
* @return array
|
||||
*/
|
||||
private function pricesToVendorInfo(string $sku, string $url, array $prices): array
|
||||
{
|
||||
$priceDTOs = array_map(function ($price) {
|
||||
$val = $price['value'] ?? null;
|
||||
$valStr = is_numeric($val)
|
||||
? number_format((float) $val, 6, '.', '') // 6 decimal places, trailing zeros are fine
|
||||
: (string) $val;
|
||||
|
||||
// Optional: softly trim unnecessary trailing zeros (e.g. 75.550000 -> 75.55)
|
||||
$valStr = rtrim(rtrim($valStr, '0'), '.');
|
||||
|
||||
return new PriceDTO(
|
||||
minimum_discount_amount: (float) ($price['minQuantity'] ?? 1),
|
||||
price: $valStr,
|
||||
currency_iso_code: (string) ($price['currencyIso'] ?? $this->settings->currency ?? 'EUR'),
|
||||
includes_tax: false
|
||||
);
|
||||
}, $prices);
|
||||
|
||||
return [
|
||||
new PurchaseInfoDTO(
|
||||
distributor_name: self::DISTRIBUTOR_NAME,
|
||||
order_number: $sku,
|
||||
prices: $priceDTOs,
|
||||
product_url: $url,
|
||||
)
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a valid Buerklin product short URL from product code
|
||||
* @param string $product_code
|
||||
* @return string
|
||||
*/
|
||||
private function getProductShortURL(string $product_code): string
|
||||
{
|
||||
return 'https://www.buerklin.com/' . $this->settings->language . '/p/' . $product_code . '/';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a deduplicated list of product images as FileDTOs.
|
||||
*
|
||||
* - takes only real image arrays (with 'url' field)
|
||||
* - makes relative URLs absolute
|
||||
* - deduplicates using URL
|
||||
* - prefers 'zoom' format, then 'product' format, then all others
|
||||
*
|
||||
* @param array|null $images
|
||||
* @return \App\Services\InfoProviderSystem\DTOs\FileDTO[]
|
||||
*/
|
||||
private function getProductImages(?array $images): array
|
||||
{
|
||||
if (!is_array($images)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// 1) Only real image entries with URL
|
||||
$imgs = array_values(array_filter($images, fn($i) => is_array($i) && !empty($i['url'])));
|
||||
|
||||
// 2) Prefer zoom images
|
||||
$zoom = array_values(array_filter($imgs, fn($i) => ($i['format'] ?? null) === 'zoom'));
|
||||
$chosen = count($zoom) > 0
|
||||
? $zoom
|
||||
: array_values(array_filter($imgs, fn($i) => ($i['format'] ?? null) === 'product'));
|
||||
|
||||
// 3) If still none, take all
|
||||
if (count($chosen) === 0) {
|
||||
$chosen = $imgs;
|
||||
}
|
||||
|
||||
// 4) Deduplicate by URL (after making absolute)
|
||||
$byUrl = [];
|
||||
foreach ($chosen as $img) {
|
||||
$url = (string) $img['url'];
|
||||
|
||||
if (!str_starts_with($url, 'http://') && !str_starts_with($url, 'https://')) {
|
||||
$url = 'https://www.buerklin.com' . $url;
|
||||
}
|
||||
if (!filter_var($url, FILTER_VALIDATE_URL)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$byUrl[$url] = $url;
|
||||
}
|
||||
|
||||
return array_map(
|
||||
fn($url) => new FileDTO($url),
|
||||
array_values($byUrl)
|
||||
);
|
||||
}
|
||||
|
||||
private function attributesToParameters(array $features, ?string $group = null): array
|
||||
{
|
||||
$out = [];
|
||||
|
||||
foreach ($features as $f) {
|
||||
if (!is_array($f)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$name = $f['name'] ?? null;
|
||||
if (!is_string($name) || trim($name) === '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$vals = [];
|
||||
foreach (($f['featureValues'] ?? []) as $fv) {
|
||||
if (is_array($fv) && isset($fv['value']) && is_string($fv['value']) && trim($fv['value']) !== '') {
|
||||
$vals[] = trim($fv['value']);
|
||||
}
|
||||
}
|
||||
if (empty($vals)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Multiple values: join with comma
|
||||
$value = implode(', ', array_values(array_unique($vals)));
|
||||
|
||||
// Unit/symbol from Buerklin feature
|
||||
$unit = $f['featureUnit']['symbol'] ?? null;
|
||||
if (!is_string($unit) || trim($unit) === '') {
|
||||
$unit = null;
|
||||
}
|
||||
|
||||
// ParameterDTO parses value field (handles value + unit)
|
||||
$out[] = ParameterDTO::parseValueField(
|
||||
name: $name,
|
||||
value: $value,
|
||||
unit: $unit,
|
||||
symbol: null,
|
||||
group: $group
|
||||
);
|
||||
}
|
||||
|
||||
// Deduplicate by name
|
||||
$byName = [];
|
||||
foreach ($out as $p) {
|
||||
$byName[$p->name] ??= $p;
|
||||
}
|
||||
|
||||
return array_values($byName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return PartDetailDTO[]
|
||||
*/
|
||||
public function searchByKeyword(string $keyword): array
|
||||
{
|
||||
$keyword = strtoupper(trim($keyword));
|
||||
if ($keyword === '') {
|
||||
return [];
|
||||
}
|
||||
|
||||
$response = $this->makeAPICall('/products/search/', [
|
||||
'pageSize' => 50,
|
||||
'currentPage' => 0,
|
||||
'query' => $keyword,
|
||||
'sort' => 'relevance',
|
||||
]);
|
||||
|
||||
$products = $response['products'] ?? [];
|
||||
|
||||
// Normal case: products found in search results
|
||||
if (is_array($products) && !empty($products)) {
|
||||
return array_map(fn($p) => $this->getPartDetail($p), $products);
|
||||
}
|
||||
|
||||
// Fallback: try direct lookup by code
|
||||
try {
|
||||
$product = $this->getProduct($keyword);
|
||||
return [$this->getPartDetail($product)];
|
||||
} catch (\Throwable $e) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
public function getDetails(string $id): PartDetailDTO
|
||||
{
|
||||
// Detail endpoint is /products/{code}/
|
||||
$response = $this->getProduct($id);
|
||||
|
||||
return $this->getPartDetail($response);
|
||||
}
|
||||
|
||||
public function getCapabilities(): array
|
||||
{
|
||||
return [
|
||||
ProviderCapabilities::BASIC,
|
||||
ProviderCapabilities::PICTURE,
|
||||
//ProviderCapabilities::DATASHEET, // currently not implemented
|
||||
ProviderCapabilities::PRICE,
|
||||
ProviderCapabilities::FOOTPRINT,
|
||||
];
|
||||
}
|
||||
|
||||
private function complianceToParameters(array $product, ?string $group = 'Compliance'): array
|
||||
{
|
||||
$params = [];
|
||||
|
||||
$add = function (string $name, $value) use (&$params, $group) {
|
||||
if ($value === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_bool($value)) {
|
||||
$value = $value ? 'Yes' : 'No';
|
||||
} elseif (is_array($value) || is_object($value)) {
|
||||
// Avoid dumping large or complex structures
|
||||
return;
|
||||
} else {
|
||||
$value = trim((string) $value);
|
||||
if ($value === '') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$params[] = ParameterDTO::parseValueField(
|
||||
name: $name,
|
||||
value: (string) $value,
|
||||
unit: null,
|
||||
symbol: null,
|
||||
group: $group
|
||||
);
|
||||
};
|
||||
|
||||
$add('RoHS conform', $product['labelRoHS'] ?? null); // "yes"/"no"
|
||||
|
||||
$rawRoHsDate = $product['dateRoHS'] ?? null;
|
||||
// Try to parse and reformat date to Y-m-d (do not use language-dependent formats)
|
||||
if (is_string($rawRoHsDate) && $rawRoHsDate !== '') {
|
||||
try {
|
||||
$dt = new \DateTimeImmutable($rawRoHsDate);
|
||||
$formatted = $dt->format('Y-m-d');
|
||||
} catch (\Exception $e) {
|
||||
$formatted = $rawRoHsDate;
|
||||
}
|
||||
// Always use the same parameter name (do not use language-dependent names)
|
||||
$add('RoHS date', $formatted);
|
||||
}
|
||||
$add('SVHC free', $product['SVHC'] ?? null); // bool
|
||||
$add('Hazardous good', $product['hazardousGood'] ?? null); // bool
|
||||
$add('Hazardous materials', $product['hazardousMaterials'] ?? null); // bool
|
||||
|
||||
$add('Country of origin', $product['countryOfOrigin'] ?? null);
|
||||
// Customs tariff code must always be stored as string, otherwise "85411000" may be stored as "8.5411e+7"
|
||||
if (isset($product['articleCustomsCode'])) {
|
||||
// Raw value as string
|
||||
$codeRaw = (string) $product['articleCustomsCode'];
|
||||
|
||||
// Optionally keep only digits (in case of spaces or other characters)
|
||||
$code = preg_replace('/\D/', '', $codeRaw) ?? $codeRaw;
|
||||
$code = trim($code);
|
||||
|
||||
if ($code !== '') {
|
||||
$params[] = new ParameterDTO(
|
||||
name: 'Customs code',
|
||||
value_text: $code,
|
||||
value_typ: null,
|
||||
value_min: null,
|
||||
value_max: null,
|
||||
unit: null,
|
||||
symbol: null,
|
||||
group: $group
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string[] $keywords
|
||||
* @return array<string, SearchResultDTO[]>
|
||||
*/
|
||||
public function searchByKeywordsBatch(array $keywords): array
|
||||
{
|
||||
/** @var array<string, SearchResultDTO[]> $results */
|
||||
$results = [];
|
||||
|
||||
foreach ($keywords as $keyword) {
|
||||
$keyword = strtoupper(trim((string) $keyword));
|
||||
if ($keyword === '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Reuse existing single search -> returns PartDetailDTO[]
|
||||
/** @var PartDetailDTO[] $partDetails */
|
||||
$partDetails = $this->searchByKeyword($keyword);
|
||||
|
||||
// Convert to SearchResultDTO[]
|
||||
$results[$keyword] = array_map(
|
||||
fn(PartDetailDTO $detail) => $this->convertPartDetailToSearchResult($detail),
|
||||
$partDetails
|
||||
);
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a PartDetailDTO into a SearchResultDTO for bulk search.
|
||||
*/
|
||||
private function convertPartDetailToSearchResult(PartDetailDTO $detail): SearchResultDTO
|
||||
{
|
||||
return new SearchResultDTO(
|
||||
provider_key: $detail->provider_key,
|
||||
provider_id: $detail->provider_id,
|
||||
name: $detail->name,
|
||||
description: $detail->description ?? '',
|
||||
category: $detail->category ?? null,
|
||||
manufacturer: $detail->manufacturer ?? null,
|
||||
mpn: $detail->mpn ?? null,
|
||||
preview_image_url: $detail->preview_image_url ?? null,
|
||||
manufacturing_status: $detail->manufacturing_status ?? null,
|
||||
provider_url: $detail->provider_url ?? null,
|
||||
footprint: $detail->footprint ?? null,
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -311,6 +311,14 @@ class DigikeyProvider implements InfoProviderInterface
|
||||
'auth_bearer' => $this->authTokenManager->getAlwaysValidTokenString(self::OAUTH_APP_NAME)
|
||||
]);
|
||||
|
||||
if ($response->getStatusCode() === 404) {
|
||||
//No media found
|
||||
return [
|
||||
'datasheets' => [],
|
||||
'images' => [],
|
||||
];
|
||||
}
|
||||
|
||||
$media_array = $response->toArray();
|
||||
|
||||
foreach ($media_array['MediaLinks'] as $media_link) {
|
||||
|
||||
@@ -397,13 +397,13 @@ class OEMSecretsProvider implements InfoProviderInterface
|
||||
* Generates a cache key for storing part details based on the provided provider ID.
|
||||
*
|
||||
* This method creates a unique cache key by prefixing the provider ID with 'part_details_'
|
||||
* and hashing the provider ID using MD5 to ensure a consistent and compact key format.
|
||||
* and hashing the provider ID using XXH3 to ensure a consistent and compact key format.
|
||||
*
|
||||
* @param string $provider_id The unique identifier of the provider or part.
|
||||
* @return string The generated cache key.
|
||||
*/
|
||||
private function getCacheKey(string $provider_id): string {
|
||||
return 'oemsecrets_part_' . md5($provider_id);
|
||||
return 'oemsecrets_part_' . hash('xxh3', $provider_id);
|
||||
}
|
||||
|
||||
|
||||
@@ -680,7 +680,7 @@ class OEMSecretsProvider implements InfoProviderInterface
|
||||
if (is_array($prices)) {
|
||||
// Step 1: Check if prices exist in the preferred currency
|
||||
if (isset($prices[$this->settings->currency]) && is_array($prices[$this->settings->currency])) {
|
||||
$priceDetails = $prices[$this->$this->settings->currency];
|
||||
$priceDetails = $prices[$this->settings->currency];
|
||||
foreach ($priceDetails as $priceDetail) {
|
||||
if (
|
||||
is_array($priceDetail) &&
|
||||
|
||||
@@ -248,4 +248,4 @@ class PollinProvider implements InfoProviderInterface
|
||||
ProviderCapabilities::DATASHEET
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,9 +31,6 @@ enum ProviderCapabilities
|
||||
/** Basic information about a part, like the name, description, part number, manufacturer etc */
|
||||
case BASIC;
|
||||
|
||||
/** Information about the footprint of a part */
|
||||
case FOOTPRINT;
|
||||
|
||||
/** Provider can provide a picture for a part */
|
||||
case PICTURE;
|
||||
|
||||
@@ -43,6 +40,24 @@ enum ProviderCapabilities
|
||||
/** Provider can provide prices for a part */
|
||||
case PRICE;
|
||||
|
||||
/** Information about the footprint of a part */
|
||||
case FOOTPRINT;
|
||||
|
||||
/**
|
||||
* Get the order index for displaying capabilities in a stable order.
|
||||
* @return int
|
||||
*/
|
||||
public function getOrderIndex(): int
|
||||
{
|
||||
return match($this) {
|
||||
self::BASIC => 1,
|
||||
self::PICTURE => 2,
|
||||
self::DATASHEET => 3,
|
||||
self::PRICE => 4,
|
||||
self::FOOTPRINT => 5,
|
||||
};
|
||||
}
|
||||
|
||||
public function getTranslationKey(): string
|
||||
{
|
||||
return 'info_providers.capabilities.' . match($this) {
|
||||
|
||||
84
src/Settings/InfoProviderSystem/BuerklinSettings.php
Normal file
84
src/Settings/InfoProviderSystem/BuerklinSettings.php
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||
*
|
||||
* Copyright (C) 2019 - 2025 Jan Böhmer (https://github.com/jbtronics)
|
||||
* Copyright (C) 2025 Marc Kreidler (https://github.com/mkne)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
|
||||
namespace App\Settings\InfoProviderSystem;
|
||||
|
||||
use App\Form\Type\APIKeyType;
|
||||
use App\Settings\SettingsIcon;
|
||||
use Jbtronics\SettingsBundle\Metadata\EnvVarMode;
|
||||
use Jbtronics\SettingsBundle\Settings\Settings;
|
||||
use Jbtronics\SettingsBundle\Settings\SettingsTrait;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CountryType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CurrencyType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\LanguageType;
|
||||
use Symfony\Component\Translation\TranslatableMessage as TM;
|
||||
use Jbtronics\SettingsBundle\Settings\SettingsParameter;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
|
||||
#[Settings(label: new TM("settings.ips.buerklin"), description: new TM("settings.ips.buerklin.help"))]
|
||||
#[SettingsIcon("fa-plug")]
|
||||
class BuerklinSettings
|
||||
{
|
||||
use SettingsTrait;
|
||||
|
||||
#[SettingsParameter(
|
||||
label: new TM("settings.ips.digikey.client_id"),
|
||||
formType: APIKeyType::class,
|
||||
envVar: "PROVIDER_BUERKLIN_CLIENT_ID", envVarMode: EnvVarMode::OVERWRITE
|
||||
)]
|
||||
public ?string $clientId = null;
|
||||
|
||||
#[SettingsParameter(
|
||||
label: new TM("settings.ips.digikey.secret"),
|
||||
formType: APIKeyType::class,
|
||||
envVar: "PROVIDER_BUERKLIN_SECRET", envVarMode: EnvVarMode::OVERWRITE
|
||||
)]
|
||||
public ?string $secret = null;
|
||||
|
||||
#[SettingsParameter(
|
||||
label: new TM("settings.ips.buerklin.username"),
|
||||
formType: APIKeyType::class,
|
||||
envVar: "PROVIDER_BUERKLIN_USER", envVarMode: EnvVarMode::OVERWRITE
|
||||
)]
|
||||
public ?string $username = null;
|
||||
|
||||
#[SettingsParameter(
|
||||
label: new TM("user.edit.password"),
|
||||
formType: APIKeyType::class,
|
||||
envVar: "PROVIDER_BUERKLIN_PASSWORD", envVarMode: EnvVarMode::OVERWRITE
|
||||
)]
|
||||
public ?string $password = null;
|
||||
|
||||
#[SettingsParameter(label: new TM("settings.ips.tme.currency"), formType: CurrencyType::class,
|
||||
formOptions: ["preferred_choices" => ["EUR"]],
|
||||
envVar: "PROVIDER_BUERKLIN_CURRENCY", envVarMode: EnvVarMode::OVERWRITE)]
|
||||
#[Assert\Currency()]
|
||||
public string $currency = "EUR";
|
||||
|
||||
#[SettingsParameter(label: new TM("settings.ips.tme.language"), formType: LanguageType::class,
|
||||
formOptions: ["preferred_choices" => ["en", "de"]],
|
||||
envVar: "PROVIDER_BUERKLIN_LANGUAGE", envVarMode: EnvVarMode::OVERWRITE)]
|
||||
#[Assert\Language]
|
||||
public string $language = "en";
|
||||
}
|
||||
@@ -63,4 +63,7 @@ class InfoProviderSettings
|
||||
|
||||
#[EmbeddedSettings]
|
||||
public ?PollinSettings $pollin = null;
|
||||
|
||||
#[EmbeddedSettings]
|
||||
public ?BuerklinSettings $buerklin = null;
|
||||
}
|
||||
|
||||
13
symfony.lock
13
symfony.lock
@@ -718,18 +718,17 @@
|
||||
"files": []
|
||||
},
|
||||
"symfony/ux-translator": {
|
||||
"version": "2.9",
|
||||
"version": "2.32",
|
||||
"recipe": {
|
||||
"repo": "github.com/symfony/recipes",
|
||||
"branch": "main",
|
||||
"version": "2.9",
|
||||
"ref": "bc396565cc4cab95692dd6df810553dc22e352e1"
|
||||
"version": "2.32",
|
||||
"ref": "20e2abac415da4c3a9a6bafa059a6419beb74593"
|
||||
},
|
||||
"files": [
|
||||
"./assets/translator.js",
|
||||
"./config/packages/ux_translator.yaml",
|
||||
"./var/translations/configuration.js",
|
||||
"./var/translations/index.js"
|
||||
"assets/translator.js",
|
||||
"config/packages/ux_translator.yaml",
|
||||
"var/translations/index.js"
|
||||
]
|
||||
},
|
||||
"symfony/ux-turbo": {
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
<input type="checkbox" class="form-check-input" id="search_name" name="name" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
||||
<label for="search_name" class="form-check-label justify-content-start">{% trans %}name.label{% endtrans %}</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="search_dbid" name="dbid" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
||||
<label for="search_dbid" class="form-check-label justify-content-start">{% trans %}id.label{% endtrans %}</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="search_category" name="category" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
||||
<label for="search_category" class="form-check-label justify-content-start">{% trans %}category.label{% endtrans %}</label>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
title="{% trans %}info_providers.settings.title{% endtrans %}"
|
||||
><i class="fa-solid fa-cog"></i></a>
|
||||
{% endif %}
|
||||
{% for capability in provider.capabilities %}
|
||||
{% for capability in provider.capabilities|sort((a, b) => a.orderIndex <=> b.orderIndex) %}
|
||||
{# @var capability \App\Services\InfoProviderSystem\Providers\ProviderCapabilities #}
|
||||
<span class="badge text-bg-secondary">
|
||||
<i class="{{ capability.fAIconClass }} fa-fw"></i>
|
||||
|
||||
@@ -135,8 +135,8 @@
|
||||
|
||||
{% block additional_content %}
|
||||
{% if pdf_data %}
|
||||
<div class="card mt-2 p-1 border-secondary" style="resize: vertical; overflow: scroll; height: 250px">
|
||||
<object id="pdf_preview" data="{{ pdf_data | data_uri(mime='application/pdf') }}"style="height: inherit">
|
||||
<div class="card mt-2 p-1 border-secondary" style="resize: vertical; overflow: scroll; height: 280px">
|
||||
<object id="pdf_preview" data="{{ pdf_data | data_uri(mime='application/pdf') }}" style="height: inherit">
|
||||
</object>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -0,0 +1,271 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Tests\Services\InfoProviderSystem\Providers;
|
||||
|
||||
use App\Services\InfoProviderSystem\DTOs\PartDetailDTO;
|
||||
use App\Services\InfoProviderSystem\DTOs\SearchResultDTO;
|
||||
use App\Services\InfoProviderSystem\Providers\BuerklinProvider;
|
||||
use App\Settings\InfoProviderSystem\BuerklinSettings;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Psr\Cache\CacheItemInterface;
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
||||
use Symfony\Contracts\HttpClient\ResponseInterface;
|
||||
|
||||
/**
|
||||
* Full behavioral test suite for BuerklinProvider.
|
||||
* Includes parameter parsing, compliance parsing, images, prices and batch mode.
|
||||
*/
|
||||
class BuerklinProviderTest extends TestCase
|
||||
{
|
||||
private HttpClientInterface $httpClient;
|
||||
private CacheItemPoolInterface $cache;
|
||||
private BuerklinSettings $settings;
|
||||
private BuerklinProvider $provider;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->httpClient = $this->createMock(HttpClientInterface::class);
|
||||
|
||||
// Cache mock
|
||||
$cacheItem = $this->createMock(CacheItemInterface::class);
|
||||
$cacheItem->method('isHit')->willReturn(false);
|
||||
$cacheItem->method('set')->willReturn($cacheItem);
|
||||
|
||||
$this->cache = $this->createMock(CacheItemPoolInterface::class);
|
||||
$this->cache->method('getItem')->willReturn($cacheItem);
|
||||
|
||||
// IMPORTANT: Settings must not be instantiated directly (SettingsBundle forbids constructor)
|
||||
$ref = new \ReflectionClass(BuerklinSettings::class);
|
||||
/** @var BuerklinSettings $settings */
|
||||
$settings = $ref->newInstanceWithoutConstructor();
|
||||
|
||||
$settings->clientId = 'CID';
|
||||
$settings->secret = 'SECRET';
|
||||
$settings->username = 'USER';
|
||||
$settings->password = 'PASS';
|
||||
$settings->language = 'en';
|
||||
$settings->currency = 'EUR';
|
||||
|
||||
$this->settings = $settings;
|
||||
|
||||
$this->provider = new BuerklinProvider(
|
||||
client: $this->httpClient,
|
||||
partInfoCache: $this->cache,
|
||||
settings: $this->settings,
|
||||
);
|
||||
}
|
||||
|
||||
private function mockApi(string $expectedUrl, array $jsonResponse): void
|
||||
{
|
||||
$response = $this->createMock(ResponseInterface::class);
|
||||
$response->method('toArray')->willReturn($jsonResponse);
|
||||
|
||||
$this->httpClient
|
||||
->method('request')
|
||||
->with(
|
||||
'GET',
|
||||
$this->callback(fn($url) => str_contains((string) $url, $expectedUrl)),
|
||||
$this->anything()
|
||||
)
|
||||
->willReturn($response);
|
||||
}
|
||||
|
||||
public function testAttributesToParametersParsesUnitsAndValues(): void
|
||||
{
|
||||
$method = new \ReflectionMethod(BuerklinProvider::class, 'attributesToParameters');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$features = [
|
||||
[
|
||||
'name' => 'Zener voltage',
|
||||
'featureUnit' => ['symbol' => 'V'],
|
||||
'featureValues' => [
|
||||
['value' => '12']
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'Length',
|
||||
'featureUnit' => ['symbol' => 'mm'],
|
||||
'featureValues' => [
|
||||
['value' => '2.9']
|
||||
]
|
||||
],
|
||||
[
|
||||
'name' => 'Assembly',
|
||||
'featureUnit' => [],
|
||||
'featureValues' => [
|
||||
['value' => 'SMD']
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
$params = $method->invoke($this->provider, $features, '');
|
||||
|
||||
$this->assertCount(3, $params);
|
||||
|
||||
$this->assertSame('Zener voltage', $params[0]->name);
|
||||
$this->assertNull($params[0]->value_text);
|
||||
$this->assertSame(12.0, $params[0]->value_typ);
|
||||
$this->assertNull($params[0]->value_min);
|
||||
$this->assertNull($params[0]->value_max);
|
||||
$this->assertSame('V', $params[0]->unit);
|
||||
|
||||
$this->assertSame('Length', $params[1]->name);
|
||||
$this->assertNull($params[1]->value_text);
|
||||
$this->assertSame(2.9, $params[1]->value_typ);
|
||||
$this->assertSame('mm', $params[1]->unit);
|
||||
|
||||
$this->assertSame('Assembly', $params[2]->name);
|
||||
$this->assertSame('SMD', $params[2]->value_text);
|
||||
$this->assertNull($params[2]->unit);
|
||||
}
|
||||
|
||||
public function testComplianceParameters(): void
|
||||
{
|
||||
$method = new \ReflectionMethod(BuerklinProvider::class, 'complianceToParameters');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$product = [
|
||||
'labelRoHS' => 'Yes',
|
||||
'dateRoHS' => '2015-03-31T00:00+0000',
|
||||
'SVHC' => true,
|
||||
'hazardousGood' => false,
|
||||
'hazardousMaterials' => false,
|
||||
'countryOfOrigin' => 'China',
|
||||
'articleCustomsCode' => '85411000'
|
||||
];
|
||||
|
||||
$params = $method->invoke($this->provider, $product, 'Compliance');
|
||||
|
||||
$map = [];
|
||||
foreach ($params as $p) {
|
||||
$map[$p->name] = $p->value_text;
|
||||
}
|
||||
|
||||
$this->assertSame('Yes', $map['RoHS conform']);
|
||||
$this->assertSame('2015-03-31', $map['RoHS date']);
|
||||
$this->assertSame('Yes', $map['SVHC free']);
|
||||
$this->assertSame('No', $map['Hazardous good']);
|
||||
$this->assertSame('No', $map['Hazardous materials']);
|
||||
$this->assertSame('China', $map['Country of origin']);
|
||||
$this->assertSame('85411000', $map['Customs code']);
|
||||
}
|
||||
|
||||
public function testImageSelectionPrefersZoomAndDeduplicates(): void
|
||||
{
|
||||
$method = new \ReflectionMethod(BuerklinProvider::class, 'getProductImages');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$images = [
|
||||
['format' => 'product', 'url' => '/img/a.webp'],
|
||||
['format' => 'zoom', 'url' => '/img/z.webp'],
|
||||
['format' => 'zoom', 'url' => '/img/z.webp'], // duplicate
|
||||
['format' => 'thumbnail', 'url' => '/img/t.webp']
|
||||
];
|
||||
|
||||
$results = $method->invoke($this->provider, $images);
|
||||
|
||||
$this->assertCount(1, $results);
|
||||
$this->assertSame('https://www.buerklin.com/img/z.webp', $results[0]->url);
|
||||
}
|
||||
|
||||
public function testFootprintExtraction(): void
|
||||
{
|
||||
$method = new \ReflectionMethod(BuerklinProvider::class, 'getPartDetail');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$product = [
|
||||
'code' => 'TEST1',
|
||||
'manufacturerProductId' => 'ABC',
|
||||
'description' => 'X',
|
||||
'images' => [],
|
||||
'classifications' => [
|
||||
[
|
||||
'name' => 'Cat',
|
||||
'features' => [
|
||||
[
|
||||
'name' => 'Enclosure',
|
||||
'featureValues' => [['value' => 'SOT-23']]
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
'price' => ['value' => 1, 'currencyIso' => 'EUR']
|
||||
];
|
||||
|
||||
$dto = $method->invoke($this->provider, $product);
|
||||
$this->assertSame('SOT-23', $dto->footprint);
|
||||
}
|
||||
|
||||
public function testPriceFormatting(): void
|
||||
{
|
||||
$detailPrice = [
|
||||
[
|
||||
'minQuantity' => 1,
|
||||
'value' => 0.0885,
|
||||
'currencyIso' => 'EUR'
|
||||
]
|
||||
];
|
||||
|
||||
$method = new \ReflectionMethod(BuerklinProvider::class, 'pricesToVendorInfo');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$vendorInfo = $method->invoke($this->provider, 'SKU1', 'https://x', $detailPrice);
|
||||
|
||||
$price = $vendorInfo[0]->prices[0];
|
||||
$this->assertSame('0.0885', $price->price);
|
||||
}
|
||||
|
||||
public function testBatchSearchReturnsSearchResultDTO(): void
|
||||
{
|
||||
$mockDetail = new PartDetailDTO(
|
||||
provider_key: 'buerklin',
|
||||
provider_id: 'TESTID',
|
||||
name: 'Zener',
|
||||
description: 'Desc'
|
||||
);
|
||||
|
||||
$provider = $this->getMockBuilder(BuerklinProvider::class)
|
||||
->setConstructorArgs([
|
||||
$this->httpClient,
|
||||
$this->cache,
|
||||
$this->settings
|
||||
])
|
||||
->onlyMethods(['searchByKeyword'])
|
||||
->getMock();
|
||||
|
||||
$provider->method('searchByKeyword')->willReturn([$mockDetail]);
|
||||
|
||||
$result = $provider->searchByKeywordsBatch(['ABC']);
|
||||
|
||||
$this->assertArrayHasKey('ABC', $result);
|
||||
$this->assertIsArray($result['ABC']);
|
||||
$this->assertCount(1, $result['ABC']);
|
||||
$this->assertInstanceOf(SearchResultDTO::class, $result['ABC'][0]);
|
||||
$this->assertSame('Zener', $result['ABC'][0]->name);
|
||||
}
|
||||
|
||||
public function testConvertPartDetailToSearchResult(): void
|
||||
{
|
||||
$detail = new PartDetailDTO(
|
||||
provider_key: 'buerklin',
|
||||
provider_id: 'X1',
|
||||
name: 'PartX',
|
||||
description: 'D',
|
||||
preview_image_url: 'https://img'
|
||||
);
|
||||
|
||||
$method = new \ReflectionMethod(BuerklinProvider::class, 'convertPartDetailToSearchResult');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$dto = $method->invoke($this->provider, $detail);
|
||||
|
||||
$this->assertInstanceOf(SearchResultDTO::class, $dto);
|
||||
$this->assertSame('X1', $dto->provider_id);
|
||||
$this->assertSame('PartX', $dto->name);
|
||||
$this->assertSame('https://img', $dto->preview_image_url);
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="de">
|
||||
<file id="SchebTwoFactorBundle.de">
|
||||
<unit id="QoghNQ6" name="login">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\security\2fa_base_form.html.twig:52</note>
|
||||
<note>Translation for login</note>
|
||||
</notes>
|
||||
<segment>
|
||||
<source>login</source>
|
||||
@@ -11,4 +12,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
@@ -1,9 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="en">
|
||||
<file id="SchebTwoFactorBundle.en">
|
||||
<unit id="QoghNQ6" name="login">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\security\2fa_base_form.html.twig:52</note>
|
||||
<note>Translation for login</note>
|
||||
</notes>
|
||||
<segment>
|
||||
<source>login</source>
|
||||
@@ -11,4 +12,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
66
translations/frontend.cs.xlf
Normal file
66
translations/frontend.cs.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="cs">
|
||||
<file id="frontend.cs">
|
||||
<unit id="eLrezdb" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Hledat</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>Díly</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="S4CxO.T" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>Nový (zatím nebyl přidán do DB)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="9rnHbSK" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>Velmi slabé</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gKHmHwM" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>Slabé</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="c44gN8b" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>Střední</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="NwiBLHc" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>Silné</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Bw.iCUm" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>Velmi silné</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="U5IhkwB" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>Jdi!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
66
translations/frontend.da.xlf
Normal file
66
translations/frontend.da.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="da">
|
||||
<file id="frontend.da">
|
||||
<unit id="lQ8QeGr" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Søg</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>Komponenter</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="_cXCaLo" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>Ny (endnu ikke tilføjet til database)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="RdFvZsb" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>Meget svag</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="IBjmblZ" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>Svag</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="qSm_ID0" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>Middel</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="aWAaADS" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>Stærk</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Wa9CStW" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>Meget stærk</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="N66qZeD" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>Kom nu!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
66
translations/frontend.de.xlf
Normal file
66
translations/frontend.de.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="de">
|
||||
<file id="frontend.de">
|
||||
<unit id="eLrezdb" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Suche</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>Bauteile</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="S4CxO.T" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>Neu (noch nicht zur DB hinzugefügt)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="9rnHbSK" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>Sehr schwach</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gKHmHwM" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>Schwach</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="c44gN8b" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>Mittel</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="NwiBLHc" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>Stark</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Bw.iCUm" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>Sehr stark</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="U5IhkwB" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>Los!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
15
translations/frontend.el.xlf
Normal file
15
translations/frontend.el.xlf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="el">
|
||||
<file id="frontend.el">
|
||||
<unit id="lQ8QeGr" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Αναζήτηση</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
66
translations/frontend.en.xlf
Normal file
66
translations/frontend.en.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="en">
|
||||
<file id="frontend.en">
|
||||
<unit id="eLrezdb" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Search</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment state="translated">
|
||||
<source>part.labelp</source>
|
||||
<target>Parts</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="S4CxO.T" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>New (not added to DB yet)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="9rnHbSK" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>Very weak</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gKHmHwM" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>Weak</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="c44gN8b" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>Medium</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="NwiBLHc" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>Strong</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Bw.iCUm" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>Very strong</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="U5IhkwB" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>Go!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
66
translations/frontend.es.xlf
Normal file
66
translations/frontend.es.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="es">
|
||||
<file id="frontend.es">
|
||||
<unit id="eLrezdb" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Buscar</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>Componentes</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="S4CxO.T" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>Nuevo (no añadido a la base de datos)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="9rnHbSK" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>Muy débil</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gKHmHwM" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>Débil</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="c44gN8b" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>Medio</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="NwiBLHc" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>Fuerte</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Bw.iCUm" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>Muy fuerte</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="U5IhkwB" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>¡Vamos!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
30
translations/frontend.fr.xlf
Normal file
30
translations/frontend.fr.xlf
Normal file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="fr">
|
||||
<file id="frontend.fr">
|
||||
<unit id="lQ8QeGr" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Recherche</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>Composants</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="N66qZeD" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>Rechercher!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
66
translations/frontend.hu.xlf
Normal file
66
translations/frontend.hu.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="hu">
|
||||
<file id="frontend.hu">
|
||||
<unit id="eLrezdb" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Keresés</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>Alkatrészek</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="S4CxO.T" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>Új (még nem hozzáadva az adatbázishoz)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="9rnHbSK" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>Nagyon gyenge</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gKHmHwM" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>Gyenge</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="c44gN8b" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>Közepes</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="NwiBLHc" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>Erős</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Bw.iCUm" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>Nagyon erős</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="U5IhkwB" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>Indítás!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
66
translations/frontend.it.xlf
Normal file
66
translations/frontend.it.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="it">
|
||||
<file id="frontend.it">
|
||||
<unit id="eLrezdb" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Ricerca</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>Componenti</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="S4CxO.T" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>Nuovo (non ancora aggiunto al DB)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="9rnHbSK" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>Molto debole</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gKHmHwM" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>Debole</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="c44gN8b" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>Media</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="NwiBLHc" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>Forte</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Bw.iCUm" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>Molto forte</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="U5IhkwB" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>Cerca!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
30
translations/frontend.ja.xlf
Normal file
30
translations/frontend.ja.xlf
Normal file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="ja">
|
||||
<file id="frontend.ja">
|
||||
<unit id="lQ8QeGr" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>検索</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>部品</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="N66qZeD" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>検索</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
15
translations/frontend.nl.xlf
Normal file
15
translations/frontend.nl.xlf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="nl">
|
||||
<file id="frontend.nl">
|
||||
<unit id="lQ8QeGr" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Zoeken</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
66
translations/frontend.pl.xlf
Normal file
66
translations/frontend.pl.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="pl">
|
||||
<file id="frontend.pl">
|
||||
<unit id="eLrezdb" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Szukaj</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>Komponenty</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="S4CxO.T" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>Nowość (jeszcze niedodana do DB)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="9rnHbSK" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>Bardzo słabe</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gKHmHwM" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>Słabe</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="c44gN8b" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>Średnie</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="NwiBLHc" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>Mocne</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Bw.iCUm" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>Bardzo mocne</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="U5IhkwB" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>Idź!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
66
translations/frontend.ru.xlf
Normal file
66
translations/frontend.ru.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="ru">
|
||||
<file id="frontend.ru">
|
||||
<unit id="eLrezdb" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>Поиск</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>Компоненты</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="S4CxO.T" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>Новый (еще не добавленный в БД)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="9rnHbSK" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>Очень слабый</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="gKHmHwM" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>Слабый</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="c44gN8b" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>Средний</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="NwiBLHc" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>Сильный</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Bw.iCUm" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>Очень сильный</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="U5IhkwB" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>Поехали!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
66
translations/frontend.zh.xlf
Normal file
66
translations/frontend.zh.xlf
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="zh">
|
||||
<file id="frontend.zh">
|
||||
<unit id="lQ8QeGr" name="search.placeholder">
|
||||
<notes>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
<target>搜索</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="R4hoCqe" name="part.labelp">
|
||||
<segment>
|
||||
<source>part.labelp</source>
|
||||
<target>部件</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="_cXCaLo" name="entity.select.group.new_not_added_to_DB">
|
||||
<segment state="translated">
|
||||
<source>entity.select.group.new_not_added_to_DB</source>
|
||||
<target>新建(尚未添加到数据库)</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="RdFvZsb" name="user.password_strength.very_weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_weak</source>
|
||||
<target>非常弱</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="IBjmblZ" name="user.password_strength.weak">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.weak</source>
|
||||
<target>弱</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="qSm_ID0" name="user.password_strength.medium">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.medium</source>
|
||||
<target>中</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="aWAaADS" name="user.password_strength.strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.strong</source>
|
||||
<target>强</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="Wa9CStW" name="user.password_strength.very_strong">
|
||||
<segment state="translated">
|
||||
<source>user.password_strength.very_strong</source>
|
||||
<target>非常强</target>
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="N66qZeD" name="search.submit">
|
||||
<notes>
|
||||
<note>Translation for search submit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.submit</source>
|
||||
<target>GO!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,10 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="nl">
|
||||
<file id="messages.en">
|
||||
<unit id="0Md_YOf" name="attachment_type.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4</note>
|
||||
<note priority="1">templates\AdminPages\AttachmentTypeAdmin.html.twig:4</note>
|
||||
<note>Caption for attachment type</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>attachment_type.caption</source>
|
||||
@@ -14,8 +13,7 @@
|
||||
</unit>
|
||||
<unit id="5cpaOO8" name="attachment_type.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:12</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for attachment type</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>attachment_type.edit</source>
|
||||
@@ -24,8 +22,7 @@
|
||||
</unit>
|
||||
<unit id="v83r0Yh" name="attachment_type.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:16</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for attachment type</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>attachment_type.new</source>
|
||||
@@ -34,17 +31,7 @@
|
||||
</unit>
|
||||
<unit id="OllfX2C" name="category.labelp">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_sidebar.html.twig:22</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_sidebar.html.twig:7</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\_sidebar.html.twig:22</note>
|
||||
<note priority="1">Part-DB1\templates\_sidebar.html.twig:7</note>
|
||||
<note priority="1">templates\AdminPages\CategoryAdmin.html.twig:4</note>
|
||||
<note priority="1">templates\base.html.twig:163</note>
|
||||
<note priority="1">templates\base.html.twig:170</note>
|
||||
<note priority="1">templates\base.html.twig:197</note>
|
||||
<note priority="1">templates\base.html.twig:225</note>
|
||||
<note>Plural label for category</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>category.labelp</source>
|
||||
@@ -53,11 +40,7 @@
|
||||
</unit>
|
||||
<unit id="lnjU5yu" name="admin.options">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:19</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:11</note>
|
||||
<note priority="1">templates\AdminPages\CategoryAdmin.html.twig:8</note>
|
||||
<note>Admin section: options</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>admin.options</source>
|
||||
@@ -66,11 +49,7 @@
|
||||
</unit>
|
||||
<unit id="CuAPq5N" name="admin.advanced">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15</note>
|
||||
<note priority="1">templates\AdminPages\CategoryAdmin.html.twig:9</note>
|
||||
<note>Admin section: advanced</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>admin.advanced</source>
|
||||
@@ -79,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="eL_giUu" name="category.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:13</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for category</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>category.edit</source>
|
||||
@@ -89,8 +67,7 @@
|
||||
</unit>
|
||||
<unit id="AT4wfK_" name="category.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:17</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for category</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>category.new</source>
|
||||
@@ -99,8 +76,7 @@
|
||||
</unit>
|
||||
<unit id="BJtSZa4" name="currency.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4</note>
|
||||
<note>Caption for currency</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>currency.caption</source>
|
||||
@@ -109,8 +85,7 @@
|
||||
</unit>
|
||||
<unit id="dzfYFww" name="currency.iso_code.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12</note>
|
||||
<note>Caption for currency iso code</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>currency.iso_code.caption</source>
|
||||
@@ -119,8 +94,7 @@
|
||||
</unit>
|
||||
<unit id="lrCa3tF" name="currency.symbol.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15</note>
|
||||
<note>Caption for currency symbol</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>currency.symbol.caption</source>
|
||||
@@ -129,8 +103,7 @@
|
||||
</unit>
|
||||
<unit id="pfHq2BO" name="currency.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:29</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for currency</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>currency.edit</source>
|
||||
@@ -139,8 +112,7 @@
|
||||
</unit>
|
||||
<unit id="b9Ed.K9" name="currency.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:33</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for currency</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>currency.new</source>
|
||||
@@ -149,8 +121,7 @@
|
||||
</unit>
|
||||
<unit id="DTt5Co7" name="project.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:8</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for project</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>project.edit</source>
|
||||
@@ -159,8 +130,7 @@
|
||||
</unit>
|
||||
<unit id="O_iNK2O" name="project.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:12</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for project</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>project.new</source>
|
||||
@@ -169,21 +139,7 @@
|
||||
</unit>
|
||||
<unit id="lQ8QeGr" name="search.placeholder">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_navbar_search.html.twig:67</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_sidebar.html.twig:27</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_sidebar.html.twig:43</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_sidebar.html.twig:63</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19</note>
|
||||
<note priority="1">Part-DB1\templates\_navbar_search.html.twig:61</note>
|
||||
<note priority="1">Part-DB1\templates\_sidebar.html.twig:27</note>
|
||||
<note priority="1">Part-DB1\templates\_sidebar.html.twig:43</note>
|
||||
<note priority="1">Part-DB1\templates\_sidebar.html.twig:63</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:9</note>
|
||||
<note priority="1">templates\base.html.twig:80</note>
|
||||
<note priority="1">templates\base.html.twig:179</note>
|
||||
<note priority="1">templates\base.html.twig:206</note>
|
||||
<note priority="1">templates\base.html.twig:237</note>
|
||||
<note>Placeholder text for search</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>search.placeholder</source>
|
||||
@@ -192,14 +148,7 @@
|
||||
</unit>
|
||||
<unit id="10f_Ka3" name="expandAll">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_sidebar.html.twig:3</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23</note>
|
||||
<note priority="1">Part-DB1\templates\_sidebar.html.twig:3</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:13</note>
|
||||
<note priority="1">templates\base.html.twig:166</note>
|
||||
<note priority="1">templates\base.html.twig:193</note>
|
||||
<note priority="1">templates\base.html.twig:221</note>
|
||||
<note>Translation for expandAll</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>expandAll</source>
|
||||
@@ -208,14 +157,7 @@
|
||||
</unit>
|
||||
<unit id="eS_kUcS" name="reduceAll">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_sidebar.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27</note>
|
||||
<note priority="1">Part-DB1\templates\_sidebar.html.twig:4</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:17</note>
|
||||
<note priority="1">templates\base.html.twig:167</note>
|
||||
<note priority="1">templates\base.html.twig:194</note>
|
||||
<note priority="1">templates\base.html.twig:222</note>
|
||||
<note>Translation for reduceAll</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>reduceAll</source>
|
||||
@@ -224,10 +166,7 @@
|
||||
</unit>
|
||||
<unit id="tagdXMa" name="part.info.timetravel_hint">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\Parts\info\_sidebar.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54</note>
|
||||
<note priority="1">Part-DB1\templates\Parts\info\_sidebar.html.twig:4</note>
|
||||
<note>Info about part: timetravel hint</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.info.timetravel_hint</source>
|
||||
@@ -236,9 +175,7 @@
|
||||
</unit>
|
||||
<unit id="7uawYY6" name="standard.label">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:42</note>
|
||||
<note>Label for standard</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>standard.label</source>
|
||||
@@ -247,9 +184,7 @@
|
||||
</unit>
|
||||
<unit id="Fe5ax26" name="infos.label">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:43</note>
|
||||
<note>Label for infos</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>infos.label</source>
|
||||
@@ -258,9 +193,7 @@
|
||||
</unit>
|
||||
<unit id="PNqzf_X" name="history.label">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63</note>
|
||||
<note priority="1">new</note>
|
||||
<note>Label for history</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>history.label</source>
|
||||
@@ -269,9 +202,7 @@
|
||||
</unit>
|
||||
<unit id="Y2QKWU9" name="export.label">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:45</note>
|
||||
<note>Label for export</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>export.label</source>
|
||||
@@ -280,9 +211,7 @@
|
||||
</unit>
|
||||
<unit id="k5fWSN4" name="import_export.label">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:47</note>
|
||||
<note>Label for import export</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>import_export.label</source>
|
||||
@@ -291,8 +220,7 @@
|
||||
</unit>
|
||||
<unit id="sOYxh4M" name="mass_creation.label">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69</note>
|
||||
<note>Label for mass creation</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>mass_creation.label</source>
|
||||
@@ -301,9 +229,7 @@
|
||||
</unit>
|
||||
<unit id="wTQX7oE" name="admin.common">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:59</note>
|
||||
<note>Admin section: common</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>admin.common</source>
|
||||
@@ -312,8 +238,7 @@
|
||||
</unit>
|
||||
<unit id="NmnCJhH" name="admin.attachments">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86</note>
|
||||
<note>Admin section: attachments</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>admin.attachments</source>
|
||||
@@ -322,7 +247,7 @@
|
||||
</unit>
|
||||
<unit id="TA1hSYV" name="admin.parameters">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:90</note>
|
||||
<note>Admin section: parameters</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>admin.parameters</source>
|
||||
@@ -331,9 +256,7 @@
|
||||
</unit>
|
||||
<unit id="R949JGz" name="export_all.label">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:179</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:167</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:142</note>
|
||||
<note>Label for export all</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>export_all.label</source>
|
||||
@@ -342,8 +265,7 @@
|
||||
</unit>
|
||||
<unit id="zPSdxU4" name="mass_creation.help">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:185</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:173</note>
|
||||
<note>Help text for mass creation</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>mass_creation.help</source>
|
||||
@@ -352,9 +274,7 @@
|
||||
</unit>
|
||||
<unit id="a5.CFfq" name="edit.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:35</note>
|
||||
<note>Caption for edit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>edit.caption</source>
|
||||
@@ -363,9 +283,7 @@
|
||||
</unit>
|
||||
<unit id="bblk5.r" name="new.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50</note>
|
||||
<note priority="1">templates\AdminPages\EntityAdminBase.html.twig:37</note>
|
||||
<note>Caption for new</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>new.caption</source>
|
||||
@@ -374,13 +292,7 @@
|
||||
</unit>
|
||||
<unit id="ZJ9SPOS" name="footprint.labelp">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_sidebar.html.twig:9</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\_sidebar.html.twig:9</note>
|
||||
<note priority="1">templates\base.html.twig:172</note>
|
||||
<note priority="1">templates\base.html.twig:199</note>
|
||||
<note priority="1">templates\base.html.twig:227</note>
|
||||
<note>Plural label for footprint</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>footprint.labelp</source>
|
||||
@@ -389,8 +301,7 @@
|
||||
</unit>
|
||||
<unit id="U4500WS" name="footprint.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:13</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for footprint</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>footprint.edit</source>
|
||||
@@ -399,8 +310,7 @@
|
||||
</unit>
|
||||
<unit id="O3SliSK" name="footprint.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:17</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for footprint</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>footprint.new</source>
|
||||
@@ -409,8 +319,7 @@
|
||||
</unit>
|
||||
<unit id="ZOZqHeB" name="group.edit.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4</note>
|
||||
<note>Caption for group edit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>group.edit.caption</source>
|
||||
@@ -419,10 +328,7 @@
|
||||
</unit>
|
||||
<unit id="iK5P0V5" name="user.edit.permissions">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:16</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:16</note>
|
||||
<note>User edit permissions</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.edit.permissions</source>
|
||||
@@ -431,8 +337,7 @@
|
||||
</unit>
|
||||
<unit id="BaTTHkG" name="group.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\GroupAdmin.html.twig:24</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for group</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>group.edit</source>
|
||||
@@ -441,8 +346,7 @@
|
||||
</unit>
|
||||
<unit id="vdjTPNv" name="group.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\GroupAdmin.html.twig:28</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for group</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>group.new</source>
|
||||
@@ -451,7 +355,7 @@
|
||||
</unit>
|
||||
<unit id="Rr_.JrB" name="label_profile.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:4</note>
|
||||
<note>Caption for label profile</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>label_profile.caption</source>
|
||||
@@ -460,7 +364,7 @@
|
||||
</unit>
|
||||
<unit id="QPqYdRg" name="label_profile.advanced">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:8</note>
|
||||
<note>Label profile: advanced</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>label_profile.advanced</source>
|
||||
@@ -469,7 +373,7 @@
|
||||
</unit>
|
||||
<unit id="Pi_q_nj" name="label_profile.comment">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:9</note>
|
||||
<note>Label profile: comment</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>label_profile.comment</source>
|
||||
@@ -478,8 +382,7 @@
|
||||
</unit>
|
||||
<unit id="VwVLyJA" name="label_profile.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:55</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for label profile</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>label_profile.edit</source>
|
||||
@@ -488,8 +391,7 @@
|
||||
</unit>
|
||||
<unit id="lObewxU" name="label_profile.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:59</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for label profile</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>label_profile.new</source>
|
||||
@@ -498,9 +400,7 @@
|
||||
</unit>
|
||||
<unit id="Fum_mCX" name="manufacturer.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4</note>
|
||||
<note priority="1">templates\AdminPages\ManufacturerAdmin.html.twig:4</note>
|
||||
<note>Caption for manufacturer</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>manufacturer.caption</source>
|
||||
@@ -509,8 +409,7 @@
|
||||
</unit>
|
||||
<unit id="e41FWWa" name="manufacturer.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:8</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for manufacturer</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>manufacturer.edit</source>
|
||||
@@ -519,8 +418,7 @@
|
||||
</unit>
|
||||
<unit id="g4gO3Qs" name="manufacturer.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:12</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for manufacturer</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>manufacturer.new</source>
|
||||
@@ -529,8 +427,7 @@
|
||||
</unit>
|
||||
<unit id="6tFKnGD" name="measurement_unit.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4</note>
|
||||
<note>Caption for measurement unit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>measurement_unit.caption</source>
|
||||
@@ -545,13 +442,7 @@
|
||||
</unit>
|
||||
<unit id="vZGwiMS" name="storelocation.labelp">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\_sidebar.html.twig:8</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:4</note>
|
||||
<note priority="1">Part-DB1\templates\_sidebar.html.twig:8</note>
|
||||
<note priority="1">templates\base.html.twig:171</note>
|
||||
<note priority="1">templates\base.html.twig:198</note>
|
||||
<note priority="1">templates\base.html.twig:226</note>
|
||||
<note>Plural label for storelocation</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>storelocation.labelp</source>
|
||||
@@ -560,8 +451,7 @@
|
||||
</unit>
|
||||
<unit id="eSA7p5N" name="storelocation.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:32</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for storelocation</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>storelocation.edit</source>
|
||||
@@ -570,8 +460,7 @@
|
||||
</unit>
|
||||
<unit id="eIvG1.A" name="storelocation.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:36</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for storelocation</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>storelocation.new</source>
|
||||
@@ -580,8 +469,7 @@
|
||||
</unit>
|
||||
<unit id="DpVIJeK" name="supplier.edit">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:16</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>Edit button/heading for supplier</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>supplier.edit</source>
|
||||
@@ -590,8 +478,7 @@
|
||||
</unit>
|
||||
<unit id="AcG6iT_" name="supplier.new">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:20</note>
|
||||
<note category="state" priority="1">new</note>
|
||||
<note>New button/heading for supplier</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>supplier.new</source>
|
||||
@@ -600,8 +487,7 @@
|
||||
</unit>
|
||||
<unit id=".YoS4pi" name="user.edit.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:8</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:8</note>
|
||||
<note>Caption for user edit</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.edit.caption</source>
|
||||
@@ -610,8 +496,7 @@
|
||||
</unit>
|
||||
<unit id="eDE4Z9X" name="user.edit.configuration">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:14</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:14</note>
|
||||
<note>User edit configuration</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.edit.configuration</source>
|
||||
@@ -620,8 +505,7 @@
|
||||
</unit>
|
||||
<unit id="3HIFZxy" name="user.edit.password">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:15</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:15</note>
|
||||
<note>User edit password</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.edit.password</source>
|
||||
@@ -630,8 +514,7 @@
|
||||
</unit>
|
||||
<unit id="CpSdWDM" name="user.edit.tfa.caption">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:45</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:45</note>
|
||||
<note>Caption for user edit tfa</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.edit.tfa.caption</source>
|
||||
@@ -640,8 +523,7 @@
|
||||
</unit>
|
||||
<unit id="QAuf3JI" name="user.edit.tfa.google_active">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:47</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:47</note>
|
||||
<note>User edit tfa google active</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.edit.tfa.google_active</source>
|
||||
@@ -650,12 +532,7 @@
|
||||
</unit>
|
||||
<unit id="7v_PSOf" name="tfa_backup.remaining_tokens">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:48</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\Users\backup_codes.html.twig:15</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\Users\_2fa_settings.html.twig:95</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:48</note>
|
||||
<note priority="1">Part-DB1\templates\Users\backup_codes.html.twig:15</note>
|
||||
<note priority="1">Part-DB1\templates\Users\_2fa_settings.html.twig:95</note>
|
||||
<note>Translation for tfa backup remaining tokens</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>tfa_backup.remaining_tokens</source>
|
||||
@@ -664,12 +541,7 @@
|
||||
</unit>
|
||||
<unit id="xhNIm7L" name="tfa_backup.generation_date">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:49</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\Users\backup_codes.html.twig:17</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\Users\_2fa_settings.html.twig:96</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:49</note>
|
||||
<note priority="1">Part-DB1\templates\Users\backup_codes.html.twig:17</note>
|
||||
<note priority="1">Part-DB1\templates\Users\_2fa_settings.html.twig:96</note>
|
||||
<note>Translation for tfa backup generation date</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>tfa_backup.generation_date</source>
|
||||
@@ -678,10 +550,7 @@
|
||||
</unit>
|
||||
<unit id="_m6S_4Y" name="user.edit.tfa.disabled">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:53</note>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:60</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:53</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:60</note>
|
||||
<note>User edit tfa disabled</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.edit.tfa.disabled</source>
|
||||
@@ -690,8 +559,7 @@
|
||||
</unit>
|
||||
<unit id="TagZ6I5" name="user.edit.tfa.u2f_keys_count">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:56</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:56</note>
|
||||
<note>User edit tfa u2f keys count</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.edit.tfa.u2f_keys_count</source>
|
||||
@@ -700,8 +568,7 @@
|
||||
</unit>
|
||||
<unit id=".K9hu_c" name="user.edit.tfa.disable_tfa_title">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:72</note>
|
||||
<note priority="1">Part-DB1\templates\AdminPages\UserAdmin.html.twig:72</note>
|
||||
<note>User edit tfa disable tfa title</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.edit.tfa.disable_tfa_title</source>
|
||||
@@ -842,12 +709,12 @@
|
||||
</unit>
|
||||
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
|
||||
<notes>
|
||||
<note priority="1">Do not remove! Used for datatables rendering.</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<note>Translation for datatable datatable lengthMenu</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>datatable.datatable.lengthMenu</source>
|
||||
<target>_MENU_</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,41 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="cs">
|
||||
<file id="validators.en">
|
||||
<unit id="cRbk.cm" name="part.master_attachment.must_be_picture">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\LabelSystem\LabelProfile.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Part master attachment must be picture</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.master_attachment.must_be_picture</source>
|
||||
@@ -44,43 +13,7 @@
|
||||
</unit>
|
||||
<unit id="v8HkcJB" name="structural.entity.unique_name">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">src\Entity\AttachmentType.php:0</note>
|
||||
<note priority="1">src\Entity\Category.php:0</note>
|
||||
<note priority="1">src\Entity\Company.php:0</note>
|
||||
<note priority="1">src\Entity\Device.php:0</note>
|
||||
<note priority="1">src\Entity\Footprint.php:0</note>
|
||||
<note priority="1">src\Entity\Group.php:0</note>
|
||||
<note priority="1">src\Entity\Manufacturer.php:0</note>
|
||||
<note priority="1">src\Entity\PartsContainingDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Storelocation.php:0</note>
|
||||
<note priority="1">src\Entity\StructuralDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Supplier.php:0</note>
|
||||
<note>Translation for structural entity unique name</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>structural.entity.unique_name</source>
|
||||
@@ -89,18 +22,7 @@
|
||||
</unit>
|
||||
<unit id="dW7b2B_" name="parameters.validator.min_lesser_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_typical</source>
|
||||
@@ -109,18 +31,7 @@
|
||||
</unit>
|
||||
<unit id="Yfp2uC5" name="parameters.validator.min_lesser_max">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser max</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_max</source>
|
||||
@@ -129,18 +40,7 @@
|
||||
</unit>
|
||||
<unit id="P6b.8Ou" name="parameters.validator.max_greater_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator max greater typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.max_greater_typical</source>
|
||||
@@ -149,8 +49,7 @@
|
||||
</unit>
|
||||
<unit id="P41193Y" name="validator.user.username_already_used">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Translation for validator user username already used</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.user.username_already_used</source>
|
||||
@@ -159,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="EKPQiyf" name="user.invalid_username">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>User invalid username</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.invalid_username</source>
|
||||
@@ -169,7 +67,7 @@
|
||||
</unit>
|
||||
<unit id="_v.DMg." name="validator.noneofitschild.self">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild self</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.self</source>
|
||||
@@ -178,7 +76,7 @@
|
||||
</unit>
|
||||
<unit id="W90LyFQ" name="validator.noneofitschild.children">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild children</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.children</source>
|
||||
@@ -366,4 +264,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
@@ -1,41 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="da">
|
||||
<file id="validators.en">
|
||||
<unit id="xevSdCK" name="part.master_attachment.must_be_picture">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\LabelSystem\LabelProfile.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Part master attachment must be picture</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.master_attachment.must_be_picture</source>
|
||||
@@ -44,43 +13,7 @@
|
||||
</unit>
|
||||
<unit id="VJHTkxx" name="structural.entity.unique_name">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">src\Entity\AttachmentType.php:0</note>
|
||||
<note priority="1">src\Entity\Category.php:0</note>
|
||||
<note priority="1">src\Entity\Company.php:0</note>
|
||||
<note priority="1">src\Entity\Device.php:0</note>
|
||||
<note priority="1">src\Entity\Footprint.php:0</note>
|
||||
<note priority="1">src\Entity\Group.php:0</note>
|
||||
<note priority="1">src\Entity\Manufacturer.php:0</note>
|
||||
<note priority="1">src\Entity\PartsContainingDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Storelocation.php:0</note>
|
||||
<note priority="1">src\Entity\StructuralDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Supplier.php:0</note>
|
||||
<note>Translation for structural entity unique name</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>structural.entity.unique_name</source>
|
||||
@@ -89,18 +22,7 @@
|
||||
</unit>
|
||||
<unit id="3ODUtpU" name="parameters.validator.min_lesser_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_typical</source>
|
||||
@@ -109,18 +31,7 @@
|
||||
</unit>
|
||||
<unit id="jDBA_WW" name="parameters.validator.min_lesser_max">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser max</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_max</source>
|
||||
@@ -129,18 +40,7 @@
|
||||
</unit>
|
||||
<unit id="ygK_e_X" name="parameters.validator.max_greater_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator max greater typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.max_greater_typical</source>
|
||||
@@ -149,8 +49,7 @@
|
||||
</unit>
|
||||
<unit id="isXL.ie" name="validator.user.username_already_used">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Translation for validator user username already used</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.user.username_already_used</source>
|
||||
@@ -159,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="NcM463r" name="user.invalid_username">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>User invalid username</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.invalid_username</source>
|
||||
@@ -169,7 +67,7 @@
|
||||
</unit>
|
||||
<unit id="lZvhKYu" name="validator.noneofitschild.self">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild self</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.self</source>
|
||||
@@ -178,7 +76,7 @@
|
||||
</unit>
|
||||
<unit id="pr07aV4" name="validator.noneofitschild.children">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild children</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.children</source>
|
||||
@@ -342,4 +240,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
@@ -1,41 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="de">
|
||||
<file id="validators.en">
|
||||
<unit id="cRbk.cm" name="part.master_attachment.must_be_picture">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\LabelSystem\LabelProfile.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Part master attachment must be picture</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.master_attachment.must_be_picture</source>
|
||||
@@ -44,43 +13,7 @@
|
||||
</unit>
|
||||
<unit id="v8HkcJB" name="structural.entity.unique_name">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">src\Entity\AttachmentType.php:0</note>
|
||||
<note priority="1">src\Entity\Category.php:0</note>
|
||||
<note priority="1">src\Entity\Company.php:0</note>
|
||||
<note priority="1">src\Entity\Device.php:0</note>
|
||||
<note priority="1">src\Entity\Footprint.php:0</note>
|
||||
<note priority="1">src\Entity\Group.php:0</note>
|
||||
<note priority="1">src\Entity\Manufacturer.php:0</note>
|
||||
<note priority="1">src\Entity\PartsContainingDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Storelocation.php:0</note>
|
||||
<note priority="1">src\Entity\StructuralDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Supplier.php:0</note>
|
||||
<note>Translation for structural entity unique name</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>structural.entity.unique_name</source>
|
||||
@@ -89,18 +22,7 @@
|
||||
</unit>
|
||||
<unit id="dW7b2B_" name="parameters.validator.min_lesser_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_typical</source>
|
||||
@@ -109,18 +31,7 @@
|
||||
</unit>
|
||||
<unit id="Yfp2uC5" name="parameters.validator.min_lesser_max">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser max</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_max</source>
|
||||
@@ -129,18 +40,7 @@
|
||||
</unit>
|
||||
<unit id="P6b.8Ou" name="parameters.validator.max_greater_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator max greater typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.max_greater_typical</source>
|
||||
@@ -149,8 +49,7 @@
|
||||
</unit>
|
||||
<unit id="P41193Y" name="validator.user.username_already_used">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Translation for validator user username already used</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.user.username_already_used</source>
|
||||
@@ -159,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="EKPQiyf" name="user.invalid_username">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>User invalid username</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.invalid_username</source>
|
||||
@@ -169,7 +67,7 @@
|
||||
</unit>
|
||||
<unit id="_v.DMg." name="validator.noneofitschild.self">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild self</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.self</source>
|
||||
@@ -178,7 +76,7 @@
|
||||
</unit>
|
||||
<unit id="W90LyFQ" name="validator.noneofitschild.children">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild children</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.children</source>
|
||||
@@ -366,4 +264,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
@@ -1,41 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="en">
|
||||
<file id="validators.en">
|
||||
<unit id="cRbk.cm" name="part.master_attachment.must_be_picture">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\LabelSystem\LabelProfile.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Part master attachment must be picture</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.master_attachment.must_be_picture</source>
|
||||
@@ -44,43 +13,7 @@
|
||||
</unit>
|
||||
<unit id="v8HkcJB" name="structural.entity.unique_name">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">src\Entity\AttachmentType.php:0</note>
|
||||
<note priority="1">src\Entity\Category.php:0</note>
|
||||
<note priority="1">src\Entity\Company.php:0</note>
|
||||
<note priority="1">src\Entity\Device.php:0</note>
|
||||
<note priority="1">src\Entity\Footprint.php:0</note>
|
||||
<note priority="1">src\Entity\Group.php:0</note>
|
||||
<note priority="1">src\Entity\Manufacturer.php:0</note>
|
||||
<note priority="1">src\Entity\PartsContainingDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Storelocation.php:0</note>
|
||||
<note priority="1">src\Entity\StructuralDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Supplier.php:0</note>
|
||||
<note>Translation for structural entity unique name</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>structural.entity.unique_name</source>
|
||||
@@ -89,18 +22,7 @@
|
||||
</unit>
|
||||
<unit id="dW7b2B_" name="parameters.validator.min_lesser_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_typical</source>
|
||||
@@ -109,18 +31,7 @@
|
||||
</unit>
|
||||
<unit id="Yfp2uC5" name="parameters.validator.min_lesser_max">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser max</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_max</source>
|
||||
@@ -129,18 +40,7 @@
|
||||
</unit>
|
||||
<unit id="P6b.8Ou" name="parameters.validator.max_greater_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator max greater typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.max_greater_typical</source>
|
||||
@@ -149,8 +49,7 @@
|
||||
</unit>
|
||||
<unit id="P41193Y" name="validator.user.username_already_used">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Translation for validator user username already used</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.user.username_already_used</source>
|
||||
@@ -159,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="EKPQiyf" name="user.invalid_username">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>User invalid username</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.invalid_username</source>
|
||||
@@ -169,7 +67,7 @@
|
||||
</unit>
|
||||
<unit id="_v.DMg." name="validator.noneofitschild.self">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild self</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.self</source>
|
||||
@@ -178,7 +76,7 @@
|
||||
</unit>
|
||||
<unit id="W90LyFQ" name="validator.noneofitschild.children">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild children</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.children</source>
|
||||
@@ -366,10 +264,10 @@
|
||||
</segment>
|
||||
</unit>
|
||||
<unit id="I330cr5" name="settings.synonyms.type_synonyms.collection_type.duplicate">
|
||||
<segment>
|
||||
<segment state="translated">
|
||||
<source>settings.synonyms.type_synonyms.collection_type.duplicate</source>
|
||||
<target>There is already a translation defined for this type and language!</target>
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
@@ -1,41 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="fr">
|
||||
<file id="validators.en">
|
||||
<unit id="cRbk.cm" name="part.master_attachment.must_be_picture">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\LabelSystem\LabelProfile.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Part master attachment must be picture</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.master_attachment.must_be_picture</source>
|
||||
@@ -44,43 +13,7 @@
|
||||
</unit>
|
||||
<unit id="v8HkcJB" name="structural.entity.unique_name">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">src\Entity\AttachmentType.php:0</note>
|
||||
<note priority="1">src\Entity\Category.php:0</note>
|
||||
<note priority="1">src\Entity\Company.php:0</note>
|
||||
<note priority="1">src\Entity\Device.php:0</note>
|
||||
<note priority="1">src\Entity\Footprint.php:0</note>
|
||||
<note priority="1">src\Entity\Group.php:0</note>
|
||||
<note priority="1">src\Entity\Manufacturer.php:0</note>
|
||||
<note priority="1">src\Entity\PartsContainingDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Storelocation.php:0</note>
|
||||
<note priority="1">src\Entity\StructuralDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Supplier.php:0</note>
|
||||
<note>Translation for structural entity unique name</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>structural.entity.unique_name</source>
|
||||
@@ -89,18 +22,7 @@
|
||||
</unit>
|
||||
<unit id="dW7b2B_" name="parameters.validator.min_lesser_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_typical</source>
|
||||
@@ -109,18 +31,7 @@
|
||||
</unit>
|
||||
<unit id="Yfp2uC5" name="parameters.validator.min_lesser_max">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser max</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_max</source>
|
||||
@@ -129,18 +40,7 @@
|
||||
</unit>
|
||||
<unit id="P6b.8Ou" name="parameters.validator.max_greater_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator max greater typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.max_greater_typical</source>
|
||||
@@ -149,8 +49,7 @@
|
||||
</unit>
|
||||
<unit id="P41193Y" name="validator.user.username_already_used">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Translation for validator user username already used</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.user.username_already_used</source>
|
||||
@@ -159,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="EKPQiyf" name="user.invalid_username">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>User invalid username</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.invalid_username</source>
|
||||
@@ -169,7 +67,7 @@
|
||||
</unit>
|
||||
<unit id="_v.DMg." name="validator.noneofitschild.self">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild self</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.self</source>
|
||||
@@ -178,7 +76,7 @@
|
||||
</unit>
|
||||
<unit id="W90LyFQ" name="validator.noneofitschild.children">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild children</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.children</source>
|
||||
@@ -366,4 +264,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
@@ -1,41 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="hr">
|
||||
<file id="validators.en">
|
||||
<unit id="cRbk.cm" name="part.master_attachment.must_be_picture">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\LabelSystem\LabelProfile.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Part master attachment must be picture</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.master_attachment.must_be_picture</source>
|
||||
@@ -44,43 +13,7 @@
|
||||
</unit>
|
||||
<unit id="v8HkcJB" name="structural.entity.unique_name">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">src\Entity\AttachmentType.php:0</note>
|
||||
<note priority="1">src\Entity\Category.php:0</note>
|
||||
<note priority="1">src\Entity\Company.php:0</note>
|
||||
<note priority="1">src\Entity\Device.php:0</note>
|
||||
<note priority="1">src\Entity\Footprint.php:0</note>
|
||||
<note priority="1">src\Entity\Group.php:0</note>
|
||||
<note priority="1">src\Entity\Manufacturer.php:0</note>
|
||||
<note priority="1">src\Entity\PartsContainingDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Storelocation.php:0</note>
|
||||
<note priority="1">src\Entity\StructuralDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Supplier.php:0</note>
|
||||
<note>Translation for structural entity unique name</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>structural.entity.unique_name</source>
|
||||
@@ -89,18 +22,7 @@
|
||||
</unit>
|
||||
<unit id="dW7b2B_" name="parameters.validator.min_lesser_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_typical</source>
|
||||
@@ -109,18 +31,7 @@
|
||||
</unit>
|
||||
<unit id="Yfp2uC5" name="parameters.validator.min_lesser_max">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser max</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_max</source>
|
||||
@@ -129,18 +40,7 @@
|
||||
</unit>
|
||||
<unit id="P6b.8Ou" name="parameters.validator.max_greater_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator max greater typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.max_greater_typical</source>
|
||||
@@ -149,8 +49,7 @@
|
||||
</unit>
|
||||
<unit id="P41193Y" name="validator.user.username_already_used">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Translation for validator user username already used</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.user.username_already_used</source>
|
||||
@@ -159,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="EKPQiyf" name="user.invalid_username">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>User invalid username</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.invalid_username</source>
|
||||
@@ -169,7 +67,7 @@
|
||||
</unit>
|
||||
<unit id="_v.DMg." name="validator.noneofitschild.self">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild self</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.self</source>
|
||||
@@ -178,7 +76,7 @@
|
||||
</unit>
|
||||
<unit id="W90LyFQ" name="validator.noneofitschild.children">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild children</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.children</source>
|
||||
@@ -360,4 +258,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
@@ -1,41 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="hu">
|
||||
<file id="validators.en">
|
||||
<unit id="cRbk.cm" name="part.master_attachment.must_be_picture">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\LabelSystem\LabelProfile.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Part master attachment must be picture</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.master_attachment.must_be_picture</source>
|
||||
@@ -44,43 +13,7 @@
|
||||
</unit>
|
||||
<unit id="v8HkcJB" name="structural.entity.unique_name">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">src\Entity\AttachmentType.php:0</note>
|
||||
<note priority="1">src\Entity\Category.php:0</note>
|
||||
<note priority="1">src\Entity\Company.php:0</note>
|
||||
<note priority="1">src\Entity\Device.php:0</note>
|
||||
<note priority="1">src\Entity\Footprint.php:0</note>
|
||||
<note priority="1">src\Entity\Group.php:0</note>
|
||||
<note priority="1">src\Entity\Manufacturer.php:0</note>
|
||||
<note priority="1">src\Entity\PartsContainingDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Storelocation.php:0</note>
|
||||
<note priority="1">src\Entity\StructuralDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Supplier.php:0</note>
|
||||
<note>Translation for structural entity unique name</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>structural.entity.unique_name</source>
|
||||
@@ -89,18 +22,7 @@
|
||||
</unit>
|
||||
<unit id="dW7b2B_" name="parameters.validator.min_lesser_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_typical</source>
|
||||
@@ -109,18 +31,7 @@
|
||||
</unit>
|
||||
<unit id="Yfp2uC5" name="parameters.validator.min_lesser_max">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser max</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_max</source>
|
||||
@@ -129,18 +40,7 @@
|
||||
</unit>
|
||||
<unit id="P6b.8Ou" name="parameters.validator.max_greater_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator max greater typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.max_greater_typical</source>
|
||||
@@ -149,8 +49,7 @@
|
||||
</unit>
|
||||
<unit id="P41193Y" name="validator.user.username_already_used">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Translation for validator user username already used</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.user.username_already_used</source>
|
||||
@@ -159,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="EKPQiyf" name="user.invalid_username">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>User invalid username</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.invalid_username</source>
|
||||
@@ -169,7 +67,7 @@
|
||||
</unit>
|
||||
<unit id="_v.DMg." name="validator.noneofitschild.self">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild self</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.self</source>
|
||||
@@ -178,7 +76,7 @@
|
||||
</unit>
|
||||
<unit id="W90LyFQ" name="validator.noneofitschild.children">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild children</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.children</source>
|
||||
@@ -366,4 +264,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
@@ -1,41 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="it">
|
||||
<file id="validators.en">
|
||||
<unit id="cRbk.cm" name="part.master_attachment.must_be_picture">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\LabelSystem\LabelProfile.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Part master attachment must be picture</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.master_attachment.must_be_picture</source>
|
||||
@@ -44,43 +13,7 @@
|
||||
</unit>
|
||||
<unit id="v8HkcJB" name="structural.entity.unique_name">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">src\Entity\AttachmentType.php:0</note>
|
||||
<note priority="1">src\Entity\Category.php:0</note>
|
||||
<note priority="1">src\Entity\Company.php:0</note>
|
||||
<note priority="1">src\Entity\Device.php:0</note>
|
||||
<note priority="1">src\Entity\Footprint.php:0</note>
|
||||
<note priority="1">src\Entity\Group.php:0</note>
|
||||
<note priority="1">src\Entity\Manufacturer.php:0</note>
|
||||
<note priority="1">src\Entity\PartsContainingDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Storelocation.php:0</note>
|
||||
<note priority="1">src\Entity\StructuralDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Supplier.php:0</note>
|
||||
<note>Translation for structural entity unique name</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>structural.entity.unique_name</source>
|
||||
@@ -89,18 +22,7 @@
|
||||
</unit>
|
||||
<unit id="dW7b2B_" name="parameters.validator.min_lesser_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_typical</source>
|
||||
@@ -109,18 +31,7 @@
|
||||
</unit>
|
||||
<unit id="Yfp2uC5" name="parameters.validator.min_lesser_max">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser max</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_max</source>
|
||||
@@ -129,18 +40,7 @@
|
||||
</unit>
|
||||
<unit id="P6b.8Ou" name="parameters.validator.max_greater_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator max greater typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.max_greater_typical</source>
|
||||
@@ -149,8 +49,7 @@
|
||||
</unit>
|
||||
<unit id="P41193Y" name="validator.user.username_already_used">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Translation for validator user username already used</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.user.username_already_used</source>
|
||||
@@ -159,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="EKPQiyf" name="user.invalid_username">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>User invalid username</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.invalid_username</source>
|
||||
@@ -169,7 +67,7 @@
|
||||
</unit>
|
||||
<unit id="_v.DMg." name="validator.noneofitschild.self">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild self</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.self</source>
|
||||
@@ -178,7 +76,7 @@
|
||||
</unit>
|
||||
<unit id="W90LyFQ" name="validator.noneofitschild.children">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild children</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.children</source>
|
||||
@@ -360,4 +258,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
@@ -1,41 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="ja">
|
||||
<file id="validators.en">
|
||||
<unit id="xevSdCK" name="part.master_attachment.must_be_picture">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\LabelSystem\LabelProfile.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Part.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Part master attachment must be picture</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>part.master_attachment.must_be_picture</source>
|
||||
@@ -44,43 +13,7 @@
|
||||
</unit>
|
||||
<unit id="VJHTkxx" name="structural.entity.unique_name">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Attachments\AttachmentType.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractCompany.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractPartsContainingDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Base\AbstractStructuralDBElement.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Devices\Device.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Category.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Footprint.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Manufacturer.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\MeasurementUnit.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Storelocation.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\Parts\Supplier.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\PriceInformations\Currency.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\Group.php:0</note>
|
||||
<note priority="1">src\Entity\AttachmentType.php:0</note>
|
||||
<note priority="1">src\Entity\Category.php:0</note>
|
||||
<note priority="1">src\Entity\Company.php:0</note>
|
||||
<note priority="1">src\Entity\Device.php:0</note>
|
||||
<note priority="1">src\Entity\Footprint.php:0</note>
|
||||
<note priority="1">src\Entity\Group.php:0</note>
|
||||
<note priority="1">src\Entity\Manufacturer.php:0</note>
|
||||
<note priority="1">src\Entity\PartsContainingDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Storelocation.php:0</note>
|
||||
<note priority="1">src\Entity\StructuralDBElement.php:0</note>
|
||||
<note priority="1">src\Entity\Supplier.php:0</note>
|
||||
<note>Translation for structural entity unique name</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>structural.entity.unique_name</source>
|
||||
@@ -89,18 +22,7 @@
|
||||
</unit>
|
||||
<unit id="3ODUtpU" name="parameters.validator.min_lesser_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_typical</source>
|
||||
@@ -109,18 +31,7 @@
|
||||
</unit>
|
||||
<unit id="jDBA_WW" name="parameters.validator.min_lesser_max">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator min lesser max</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.min_lesser_max</source>
|
||||
@@ -129,18 +40,7 @@
|
||||
</unit>
|
||||
<unit id="ygK_e_X" name="parameters.validator.max_greater_typical">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AbstractParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\AttachmentTypeParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CategoryParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\CurrencyParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\DeviceParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\FootprintParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\GroupParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\ManufacturerParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\MeasurementUnitParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\PartParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\StorelocationParameter.php:0</note>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\Parameters\SupplierParameter.php:0</note>
|
||||
<note>Translation for parameters validator max greater typical</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>parameters.validator.max_greater_typical</source>
|
||||
@@ -149,8 +49,7 @@
|
||||
</unit>
|
||||
<unit id="isXL.ie" name="validator.user.username_already_used">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>Translation for validator user username already used</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.user.username_already_used</source>
|
||||
@@ -159,8 +58,7 @@
|
||||
</unit>
|
||||
<unit id="NcM463r" name="user.invalid_username">
|
||||
<notes>
|
||||
<note category="file-source" priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note priority="1">Part-DB1\src\Entity\UserSystem\User.php:0</note>
|
||||
<note>User invalid username</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>user.invalid_username</source>
|
||||
@@ -169,7 +67,7 @@
|
||||
</unit>
|
||||
<unit id="lZvhKYu" name="validator.noneofitschild.self">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild self</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.self</source>
|
||||
@@ -178,7 +76,7 @@
|
||||
</unit>
|
||||
<unit id="pr07aV4" name="validator.noneofitschild.children">
|
||||
<notes>
|
||||
<note category="state" priority="1">obsolete</note>
|
||||
<note>Translation for validator noneofitschild children</note>
|
||||
</notes>
|
||||
<segment state="translated">
|
||||
<source>validator.noneofitschild.children</source>
|
||||
@@ -204,4 +102,4 @@
|
||||
</segment>
|
||||
</unit>
|
||||
</file>
|
||||
</xliff>
|
||||
</xliff>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user